HOWTO · PowerShell
PowerShell에서 Where-Object 명령 사용하는 방법
PowerShell의 Where-Object로 스크립트 블록과 속성 조건을 사용해 파이프라인 객체를 필터링하고, 별칭과 복합 조건을 활용하는 방법을 알아봅니다.
이 페이지의 내용
Where-Object를 사용하면 PowerShell 파이프라인에서 조건을 만족하는 객체만 남길 수 있습니다. 조건은 스크립트 블록으로 현재 객체를 검사하거나, 일반적인 비교에는 cmdlet의 간소화된 속성 구문을 사용할 수 있습니다. 아래 예제는 작고 고정된 컬렉션을 사용하므로 컴퓨터의 파일이나 실행 중인 프로세스에 의존하지 않고 조건식을 자신의 객체에 맞게 바꿔 볼 수 있습니다.
PowerShell의 Where-Object cmdlet
PowerShell 명령은 객체를 파이프라인으로 전달하는 경우가 많습니다. Where-Object는 들어오는 객체마다 조건을 한 번씩 평가하고, 조건이 참일 때만 해당 객체를 내보냅니다. 스크립트 블록 안에서 $_는 평가 중인 현재 객체를 가리킵니다. 따라서 컬렉션에 다음 명령에서 필요한 것보다 항목이 더 많을 때 이 cmdlet으로 필요한 객체만 추릴 수 있습니다.
예를 들어 아래 파이프라인은 Status가 Ready인 두 레코드만 남기고 이름을 출력합니다. 객체 속성에 맞게 바꿔 쓸 수 있는 기본 패턴입니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
$tasks = @(
[pscustomobject]@{ Name = 'Build'; Status = 'Ready' }
[pscustomobject]@{ Name = 'Test'; Status = 'Waiting' }
[pscustomobject]@{ Name = 'Package'; Status = 'Ready' }
)
$tasks | Where-Object { $_.Status -eq 'Ready' } | ForEach-Object { $_.Name }
PowerShell에서 스크립트 블록으로 필터 조건 만들기
스크립트 블록은 중괄호로 감싼 코드입니다. Where-Object와 함께 사용하면 조건식 역할을 합니다. 파이프라인의 각 객체에 대해 식을 평가하고, 결과가 참인 객체만 통과시킵니다. -FilterScript로 스크립트 블록 매개변수를 명시하거나 스크립트 블록을 위치 인수로 전달할 수 있습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
$services = @(
[pscustomobject]@{ Name = 'Archive'; StartType = 'Automatic' }
[pscustomobject]@{ Name = 'Indexer'; StartType = 'Manual' }
)
$services | Where-Object -FilterScript { $_.StartType -eq 'Automatic' }
위치 인수 형식은 같은 조건을 더 간결하게 작성합니다: $services | Where-Object { $_.StartType -eq 'Automatic' }. 두 형식 모두 객체가 파이프라인에 들어올 때마다 조건을 평가합니다. 매개변수의 역할을 명확히 드러내는 편이 가독성에 도움이 된다면 이름을 지정하는 형식을 선택하세요. 여러 속성이나 연산자를 사용하는 조건에도 스크립트 블록이 유용합니다.
PowerShell에서 Where-Object로 객체 필터링하기
속성 조건은 검사할 속성이 있는 모든 파이프라인 객체에 사용할 수 있습니다. 예를 들어 고정된 파일 유사 레코드에서 확장자를 기준으로 필터링할 수 있습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
$files = @(
[pscustomobject]@{ Name = 'notes.csv'; Extension = '.csv' }
[pscustomobject]@{ Name = 'readme.txt'; Extension = '.txt' }
[pscustomobject]@{ Name = 'sales.csv'; Extension = '.csv' }
)
$files | Where-Object { $_.Extension -eq '.csv' }
실제 디렉터리 내용을 다룰 때 Get-ChildItem은 파일 시스템 객체를 생성합니다. 원하는 디렉터리 목록을 $items에 할당한 뒤 $items | Where-Object { $_.Extension -eq '.csv' }와 같은 조건을 사용할 수 있습니다. 일치하는 항목은 해당 디렉터리의 내용에 따라 달라집니다. Where는 Where-Object의 별칭이므로 같은 스크립트 블록 형식에서 cmdlet 이름 대신 Where를 사용할 수 있습니다.
PowerShell에서 매개변수로 필터 조건 만들기
일반적인 비교에는 간소화된 구문을 사용해 Where-Object 뒤에 속성, 비교 매개변수, 값을 바로 지정할 수 있습니다. 예를 들어 $tasks | Where-Object -Property Status -EQ 'Ready'는 Status 속성을 기준으로 필터링합니다. 여기서 -Property와 -EQ는 Where-Object의 매개변수입니다. 매개변수 이름은 대소문자를 구분하지 않으므로, 이 구문에서 -eq는 같은 비교 매개변수의 이름입니다. 반면 스크립트 블록 안의 -eq는 $_.Status -eq 'Ready'와 같은 식에서 쓰이는 비교 연산자입니다.
이 형식은 단일 속성을 비교할 때 간결합니다. 두 속성을 비교하거나 조건을 결합하는 등 더 세밀한 제어가 필요하다면 스크립트 블록을 사용하세요. 두 방식 모두 들어오는 객체를 필터링하며 객체 자체를 변경하지는 않습니다.
여러 조건문 결합하기
모든 조건이 참이어야 한다면 스크립트 블록에서 -and로 조건을 결합하고, 어느 한 조건만 참이어도 된다면 -or를 사용합니다. 괄호는 비교식을 묶어 의도한 논리를 한눈에 파악하기 쉽게 합니다. 특별한 서브식 구문이 반드시 필요한 것은 아닙니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
$tasks = @(
[pscustomobject]@{ Name = 'Build'; Status = 'Ready'; Priority = 1 }
[pscustomobject]@{ Name = 'Test'; Status = 'Waiting'; Priority = 1 }
[pscustomobject]@{ Name = 'Package'; Status = 'Ready'; Priority = 3 }
)
$tasks | Where-Object { ($_.Status -eq 'Ready') -and ($_.Priority -le 2) }
$tasks | Where-Object { ($_.Name -eq 'Test') -or ($_.Priority -ge 3) }
첫 번째 조건은 상태가 Ready이면서 우선순위가 높은(우선순위 값이 2 이하인) 레코드만 남깁니다. 두 번째 조건은 이름이 Test이거나 우선순위가 3 이상인 레코드를 남깁니다. 필터링 작업에서 모든 기준을 충족해야 하는지, 어느 한 기준만 충족하면 되는지에 따라 -and 또는 -or를 선택하세요.