다음을 통해 공유


파이프라인에서 개체 제거

PowerShell에서는 종종 원하는 것보다 더 많은 개체를 생성하고 파이프라인에 전달합니다. Format-* cmdlet을 사용하여 표시할 특정 개체의 속성을 지정할 수 있지만 전체 개체를 표시하지 않는 문제에는 도움이 되지 않습니다. 파이프라인 끝에 도달하기 전에 개체를 필터링하여 처음 만들어진 개체의 하위 집합에 대해서만 특정 작업을 수행할 수 있습니다.

PowerShell에는 파이프라인의 Where-Object 각 개체를 테스트하고 특정 테스트 조건을 충족하는 경우에만 파이프라인을 따라 전달할 수 있는 cmdlet이 포함되어 있습니다. 테스트를 통과하지 못한 개체는 파이프라인에서 제거됩니다. 테스트 조건을 FilterScript 매개 변수의 값으로 제공합니다.

Where-Object를 사용하여 간단한 테스트 수행

FilterScript값은 true 또는 false로 평가되는 하나 이상의 PowerShell 명령이 중괄호({})로 둘러싸인 스크립트 블록입니다. 이러한 스크립트 블록은 간단할 수 있지만 비교 연산자와 같은 다른 PowerShell 개념을 알고 있어야 만들 수 있습니다. 비교 연산자는 각 면에 표시되는 항목을 비교합니다. 비교 연산자의 이름은 하이픈 문자(-)로 시작되고 뒤에 이름이 옵니다. 기본 비교 연산자는 거의 모든 종류의 개체에서 작동합니다. 고급 비교 연산자는 텍스트나 배열에서만 작동할 수 있습니다.

참고 항목

기본적으로 PowerShell 비교 연산자는 대/소문자를 구분합니다.

구문 오류가 발생할 수 있으므로 <,>, = 등의 기호는 비교 연산자로 사용할 수 없고 대신 비교 연산자는 문자로 구성됩니다. 다음 표에는 기본 비교 연산자가 나와 있습니다.

비교 연산자 의미 예제(true 반환)
-eq 같음 1 -eq 1
-ne 같지 않음 1 -ne 2
-lt 보다 작음 1 -lt 2
-le 작거나 같음 1 -le 2
-gt 보다 큼 2 -gt 1
-ge 보다 크거나 같음 2 -ge 1
-처럼 텍스트에 대한 (야생카드 비교)와 같습니다. "file.doc" -like "f*.do?"
-notlike 비슷하지 않음(텍스트의 와일드카드 비교) "file.doc" -notlike "p*.doc"
포함- 포함 1,2,3 -contains 1
-notcontains 포함 안 함 1,2,3 -notcontains 4

Where-Object 스크립트 블록은 특수 변수 $_ 를 사용하여 파이프라인의 현재 개체를 참조합니다. 작동 방식의 예는 다음과 같습니다. 일련의 숫자 중에서 3보다 작은 숫자만 반환하려면 다음과 같이 Where-Object를 사용하여 숫자를 필터링하면 됩니다.

1,2,3,4 | Where-Object {$_ -lt 3}
1
2

개체 속성을 기반으로 필터링

$_ 현재 파이프라인 개체를 참조하므로 테스트에 대한 속성에 액세스할 수 있습니다.

예를 들어 WMI에서 Win32_SystemDriver 클래스를 살펴볼 수 있습니다. 특정 시스템에 수백 개의 시스템 드라이버가 있을 수 있지만 실행 중인 드라이버와 같은 특정 시스템 드라이버 집합만 사용할 수 있습니다. Win32_SystemDriver 클래스의 경우 관련 속성은 State입니다. 다음을 입력하여 실행 중인 드라이버만 선택하여 시스템 드라이버를 필터링할 수 있습니다.

Get-CimInstance -Class Win32_SystemDriver |
    Where-Object {$_.State -eq 'Running'}

그러나 이 목록에는 아직도 필요한 것보다 많은 항목이 포함되어 있으므로 StartMode 값을 테스트하여 자동으로 시작하도록 설정된 드라이버만 선택하도록 필터링할 수 있습니다.

Get-CimInstance -Class Win32_SystemDriver |
    Where-Object {$_.State -eq "Running"} |
    Where-Object {$_.StartMode -eq "Auto"}
DisplayName : RAS Asynchronous Media Driver
Name        : AsyncMac
State       : Running
Status      : OK
Started     : True

DisplayName : Audio Stub Driver
Name        : audstub
State       : Running
Status      : OK
Started     : True
...

드라이버가 실행 중이라는 것을 앞에서 확인했기 때문에 이 목록에는 아직도 불필요한 정보가 포함되어 있습니다. 실제로 이 시점에서 필요한 정보는 이름과 표시 이름뿐입니다. 다음 명령은 이러한 두 속성만 포함하므로 출력이 훨씬 더 간단합니다.

Get-CimInstance -Class Win32_SystemDriver |
    Where-Object {$_.State -eq "Running"} |
    Where-Object {$_.StartMode -eq "Manual"} |
    Format-Table -Property Name,DisplayName
Name              DisplayName
----              -----------
AsyncMac               RAS Asynchronous Media Driver
bindflt                Windows Bind Filter Driver
bowser                 Browser
CompositeBus           Composite Bus Enumerator Driver
condrv                 Console Driver
HdAudAddService        Microsoft 1.1 UAA Function Driver for High Definition Audio Service
HDAudBus               Microsoft UAA Bus Driver for High Definition Audio
HidUsb                 Microsoft HID Class Driver
HTTP                   HTTP Service
igfx                   igfx
IntcDAud               Intel(R) Display Audio
intelppm               Intel Processor Driver
...

위의 명령에는 두 개의 Where-Object 요소가 있지만 다음과 같이 -and 논리 연산자를 사용하여 단일 Where-Object 요소로 표시할 수 있습니다.

Get-CimInstance -Class Win32_SystemDriver |
    Where-Object {($_.State -eq 'Running') -and ($_.StartMode -eq 'Manual')} |
    Format-Table -Property Name,DisplayName

표준 논리 연산자는 다음 표에 나와 있습니다.

논리 연산자 의미 예제(true 반환)
-and 논리 및; 양쪽이 true이면 true입니다. (1 -eq 1) -and (2 -eq 2)
-or 논리합(둘 중 하나만 true여도 true임) (1 -eq 1) -or (1 -eq 2)
-not 논리하지 않음; 역방향 true 및 false -not (1 -eq 2)
! 논리하지 않음; 역방향 true 및 false !(1 -eq 2)