PowerShell 속성 값과 객체 컬렉션 작업 시에는 때로 필요하지 않은 항목을 필터링해야 할 때가 있습니다. PowerShell Where-Object
cmdlet을 사용하는 방법을 알고 있는 것은 PowerShell 도구 상자에 필수적인 기술입니다.
Where-Object
cmdlet은 객체를 필터링하는 편리한 방법입니다. 이 튜토리얼에서는 Where-Object
명령의 다양한 방법, 사용 가능한 매개변수, 구문, 그리고 전문가 수준의 다중 조건 사용 방법을 배우게 될 것입니다!
전제 조건
이 문서를 위한 전제 조건은 하나뿐입니다. PowerShell 명령과 구문에 대한 기본적인 이해도가 있어야 합니다.
이 문서의 모든 예제는 현재 안정 버전의 PowerShell (작성 시점에서 7.1.0)를 기준으로 합니다. 그러나 Windows PowerShell 4.0 이상을 사용하면 명령이 동일하게 작동합니다.
PowerShell Where-Object 작동 원리 이해
PowerShell Where-Object
cmdlet의 목표는 명령이 반환하는 출력을 원하는 정보만 반환하도록 필터링하는 것입니다.
간단히 말해, Where-Object
cmdlet은 필터입니다. 조건을 구성하여 True 또는 False를 반환합니다. 그 조건의 결과에 따라 cmdlet은 출력을 반환하거나 반환하지 않습니다.
그 조건은 두 가지 방법 중 하나로 작성할 수 있습니다. scriptblocks을 사용하는 “옛날” 방식과 매개변수 또는 비교문을 사용하는 “새로운” 방식입니다.
스크립트 블록을 사용하여 필터 조건 생성하기
스크립트 블록은 PowerShell에서 중요한 구성 요소입니다. 스크립트 블록은 언어 전체에서 수백 개의 장소에서 사용됩니다. 스크립트 블록은 익명 함수입니다. 코드를 구분하고 다양한 위치에서 실행하는 방법입니다. Where-Object
에 대한 필터를 스크립트 블록을 통해 빌드할 수 있습니다.
필터로 스크립트 블록을 사용하려면 FilterScript
매개변수를 사용해야 합니다. 이 매개변수를 사용하여 FilterScript
매개변수에 스크립트 블록을 생성하고 전달할 수 있으며, 그런 다음 실행됩니다.
스크립트 블록이 boolean False 또는 null 변수가 아닌 값을 반환하면 True로 간주됩니다. 그렇지 않으면 False로 간주됩니다.
예를 들어, 현재 시작 유형이 자동인 Windows 서비스를 모두 찾아야 하는 경우 Get-Service
를 사용하여 현재 서비스를 먼저 수집합니다. 그런 다음 Get-Service
는 다양한 속성을 가진 여러 가지 서비스 개체를 반환합니다.
PowerShell 파이프라인을 사용하면 해당 개체를 Where-Object
cmdlet에 파이프하여 FilterScript
매개변수를 사용할 수 있습니다. FilterScript
매개변수는 스크립트 블록을 허용하므로, 아래와 같이 각 개체의 StartType
속성이 Automatic인지 확인하는 조건을 작성할 수 있습니다.
필터링 스크립트 블록을 작성한 후, 해당 스크립트 블록을 FilterScript
매개변수에 제공합니다. Where-Object
는 파이프라인을 통해 전달된 각 개체에 대해 해당 스크립트 블록을 실행하고 각 StartType
속성을 평가합니다. 속성이 Automatic과 같다면, Where-Object
는 해당 개체를 통과시킵니다. 그렇지 않으면 개체는 삭제됩니다.
아래에이 방법론의 간단한 예제를 확인할 수 있습니다.

많은 사람들은
Where-Object
cmdlet과 positional 매개변수를 사용하고FilterScript
매개변수 이름을 포함하지 않습니다. 대신, 스크립트 블록을 단독으로 제공합니다. 예를 들어Where-Object {$_.StartType -eq 'Automatic'}
와 같이 작성합니다.
이러한 구성은 특정 시나리오에는 작동하지만, 중괄호를 사용한 스크립트 블록이나 파이프라인 변수 $_
개념은 코드를 읽기 어렵게 만들고, 경험 부족한 PowerShell 사용자에게 어려움을 줄 수 있습니다. 이러한 가독성 문제로 인해 PowerShell 팀에서는 매개변수 또는 비교문을 도입했습니다.
비교문
Windows PowerShell 3.0에서 소개된 비교문은 더욱 자연스러운 구조로 작성됩니다. 이전 예제와 동일한 시나리오를 사용하여, 비교문을 사용하여 자동 시작 유형을 갖는 모든 Windows 서비스를 찾아보겠습니다:
위에서 볼 수 있듯이, 스크립트블록 대신에 해당 명령은 Property
매개변수에 객체 속성을 매개변수 값으로 지정합니다. eq
연산자도 이제 매개변수로 사용되므로 자동 값을 전달할 수 있습니다.
이러한 방식으로 매개변수를 사용하면 스크립트블록을 전혀 사용할 필요가 없어집니다.
A scriptblock is a better choice when defining more complex filtering conditions. The
Property
parameter may not always be the best choice. If using a scriptblock, just remember to document your code using comments!
다음 섹션에서는 Where-Object
와 함께 사용할 수 있는 사용 가능한 비교 연산자 유형에 대해 알아보게 됩니다.
필터링 기본
매개변수를 사용하여 Where-Object
는 일반적인 비교 연산자를 사용하여 객체 컬렉션을 필터링합니다. 이들이 작동하는 방식에 대한 몇 가지 예제를 살펴보겠습니다.
포함 연산자
포함 연산자는 컬렉션 작업 시 유용합니다. 포함 연산자를 사용하면 컬렉션 내에 항목이 있는지 여부를 정의할 수 있습니다.
예를 들어, 컬렉션에서 특정 속성 값을 필터링하려는 경우 포함 연산자를 사용할 수 있습니다.
PowerShell에서는 다양한 포함 연산자를 사용할 수 있습니다:
-contains
/-ccontains
– 속성 값이 있는 컬렉션을 필터링합니다.-notcontains
/-cnotcontains
– 속성 값을 포함하지 않는 컬렉션을 필터링합니다.-in
/-cin
– 값이 컬렉션에 포함되어 있으면 일치하는 속성 값을 반환합니다.-notin
/-cnotin
– 값이 컬렉션에 포함되지 않으면null
/$false
을 반환합니다.
대소문자 구분을 위해 -c[연산자]
로 시작하는 포함 연산자를 사용하세요.
관련 정보: 예제로 배우는 PowerShell 비교 연산자
다음과 같이 BITS Windows 서비스의 상태를 확인하려고 합니다. 아래와 같이 contains
매개변수(연산자)를 사용하여 BITS의 값을 전달할 수 있습니다.
그리고 아래와 같은 결과가 나타날 것입니다:

항상 왼쪽에서 필터링하는 것을 기억하세요! 이전 예제는
Get-Service -ServiceName 'BITS'
를 실행한 것과 동일합니다.
더 멋지게 만들고 싶다면 실행 중이 아닌 상태와 시작 유형이 단일 문자열(또는 배열)인 Manual인 모든 서비스를 찾을 수 있을 것입니다. 아래의 스크립트 블록을 사용하여 해당 조건을 모두 평가하는 스크립트 블록을 FilterScript
매개변수로 전달하고 있는 명령입니다.
관련 정보: 기본으로 돌아가기: PowerShell 객체 이해하기
위의 명령을 실행하면, 중지된 서비스만 표시되며 StartType이 Manual인 서비스만 표시됩니다.

포함 연산자를 사용하여 많은 속성 값을 포함하는 컬렉션에 대해 필터링하는 것은 잘 작동합니다. Get-Service
가 반환하는 속성의 수를 고려하면, 포함 및 논리 연산자를 결합하여 모든 속성을 필터링하는 것이 더 쉬워집니다.
일치 연산자
코드>Where-Object와 함께 포함 연산자를 사용하는 방법과 유사하게, 일치 연산자도 사용할 수 있습니다. 일치 연산자는 문자열 내에서 문자열을 일치시킬 수 있습니다. 예를 들어, 'foofoo' -like '*foo*'
는 True를 반환하며, 'foofoo' -match 'foo'
는 True를 반환합니다. 일치 연산자는 문자열 내에서 문자열을 일치시킵니다.
PowerShell에서는 Where-Object
내에서 사용할 수 있는 여러 가지 일치 연산자가 있습니다.
-like
/-clike
– 문자열이 와일드카드 패턴과 일치합니다.-notlike
/-cnotlike
– 문자열이 와일드카드 패턴과 일치하지 않습니다.-match
/-cmatch
– 문자열이 정규식 패턴과 일치합니다.-notmatch
/-cnotmatch
– 문자열이 정규식 패턴과 일치하지 않습니다.
대소문자 구분을 위해,
-c[operator]
로 시작하는 일치 연산자를 사용하세요.
포함 연산자와 거의 동일한 형태로, 아래와 같이 일치 연산자를 사용할 수 있습니다. 아래 예제는 DisplayName 속성 값에 Windows가 있는 모든 서비스를 찾는 예제입니다.

match
operator uses regular expressions to match on certain values.관련: PowerShell 및 정규식 시작하기
또한 like
연산자를 사용하여 와일드카드(*
)를 사용하여 모든 문자와 일치시키거나, 하나의 문자와 일치시키기 위해 ?
를 사용할 수도 있습니다.
결과는 이제 ‘Win’이 처음 세 문자로 있는 서비스 이름만 필터링됩니다.

와일드카드를 사용하면 서비스의 전체 이름을 알 필요가 없습니다. 문자열의 몇 글자만 필요합니다. 이러한 연산자는 논리 연산자와 결합하여 필터링을 더욱 개선할 수도 있습니다.
등호 연산자
포함 및 비교 연산자를 사용하는 방법과 유사하게, Where-Object
와 함께 등호 연산자를 사용할 수도 있습니다. 등호 연산자는 숫자 값을 비교해야 할 때 유용합니다.
예를 들어, 1 -eq 1
은 True이고, 1 -gt 2
는 False입니다. PowerShell에는 다양한 등호 연산자가 있으며, Where-Object
매개변수나 조건 스크립트 블록 내에서 사용할 수 있습니다.
-eq
/-ceq
– 지정된 값과 값이 동일함.-ne
/-cne
– 지정된 값과 다른 값.-gt
/-cgt
– 지정된 값보다 큰 값.-ge
/-cge
– 지정된 값보다 크거나 같은 값.-lt
/-clt
– 지정된 값보다 작은 값.-le
/-cle
– 지정된 값보다 작거나 같은 값.
예를 들어, CPU의 2%에서 10% 사이를 사용하는 모든 실행 중인 프로세스를 찾고 싶다면 PowerShell cmdlet인 Get-Process
와 Where-Object
를 사용하여 문제없이 처리할 수 있습니다.
스크립트 블록을 사용하여 두 가지 조건을 and
연산자로 결합할 수 있으며, 두 조건이 모두 True를 반환하면 Where-Object
는 파이프라인을 통해 전달된 프로세스 개체를 반환합니다. 조건 중 하나 이상이 False를 반환하면 Where-Object
는 개체를 삭제합니다.
다음은 예상되는 결과입니다:

Where-Object
등호 연산자를 사용하여 필터링하면 시스템 보고서 작성이나 값 비교에 도움이 됩니다.
다음 단계
이제 PowerShell의 Where-Object
cmdlet을 사용하여 모든 것을 필터링하는 방법에 대해 더 알게 되었으니, 무엇을 더 할 수 있을까요? 여러 조건과 연산자를 사용하여 컬렉션에서 속성 값을 필터링하고 원하는대로 출력을 서식화하는 등 더 복잡한 필터링 작업을 시도해보세요.
Source:
https://adamtheautomator.com/powershell-where-object/