Share via


Removendo objetos do pipeline

No PowerShell, você geralmente gera e passa mais objetos para um pipeline do que deseja. Você pode especificar as propriedades de objetos específicos a serem exibidos usando os Format-* cmdlets, mas isso não ajuda com o problema de remover objetos inteiros da exibição. Talvez você queira filtrar objetos antes do final de um pipeline, para que possa executar ações em apenas um subconjunto dos objetos gerados inicialmente.

O PowerShell inclui um Where-Object cmdlet que permite testar cada objeto no pipeline e só passá-lo ao longo do pipeline se ele atender a uma condição de teste específica. Os objetos que não passam no teste são removidos do pipeline. Você fornece a condição de teste como o valor do parâmetro FilterScript .

Executando testes simples com Where-Object

O valor de FilterScript é um bloco de script - um ou mais comandos do PowerShell cercados por chaves ({}) - que é avaliado como true ou false. Esses blocos de script podem ser simples, mas criá-los requer saber sobre outro conceito do PowerShell, operadores de comparação. Um operador de comparação compara os itens que aparecem em cada lado dele. Os operadores de comparação começam com um caractere de hífen (-) e são seguidos por um nome. Os operadores básicos de comparação trabalham em praticamente qualquer tipo de objeto. Os operadores de comparação mais avançados podem funcionar apenas em texto ou matrizes.

Nota

Por padrão, os operadores de comparação do PowerShell não diferenciam maiúsculas de minúsculas.

Devido a considerações de análise, símbolos como <,>, e = não são usados como operadores de comparação. Em vez disso, os operadores de comparação são compostos por letras. Os operadores básicos de comparação estão listados na tabela a seguir.

Operador de comparação Significado Exemplo (retorna true)
-eq é igual a 1 -eq 1
-ne não é igual a 1 -ne 2
-lt É menor que 1 -lt 2
-le É Menor ou Igual A 1 -le 2
-GT É maior que 2 -GT 1
-GE É maior ou igual a 2 -GE 1
-como É como (comparação curinga para texto) "file.doc" -como "f*.do?"
-não gosto não é como (comparação curinga para texto) "file.doc" -nãocomo "p*.doc"
-contém Contains 1,2,3 -contém 1 seringa
-não contém não contém 1,2,3 -não contém 4

Where-Object Os blocos de script usam a variável $_ Special para se referir ao objeto atual no pipeline. Aqui está um exemplo de como funciona. Se você tiver uma lista de números e quiser retornar apenas os que são menores que 3, você pode usar Where-Object para filtrar os números digitando:

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

Filtragem com base nas propriedades do objeto

Como $_ se refere ao objeto de pipeline atual, podemos acessar suas propriedades para nossos testes.

Como exemplo, podemos olhar para a classe Win32_SystemDriver no WMI. Pode haver centenas de drivers de sistema em um determinado sistema, mas você pode estar interessado apenas em um conjunto específico de drivers de sistema, como aqueles que estão em execução. Para a classe Win32_SystemDriver , a propriedade relevante é State. Você pode filtrar os drivers do sistema, selecionando apenas os em execução, digitando:

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

Isso ainda produz uma longa lista. Você pode filtrar para selecionar apenas os drivers definidos para iniciar automaticamente, testando o valor StartMode também:

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
...

Isto dá-nos muita informação de que já não precisamos porque sabemos que os condutores estão a correr. Na verdade, as únicas informações que provavelmente precisamos neste momento são o nome e o nome de exibição. O comando a seguir inclui apenas essas duas propriedades, resultando em uma saída muito mais simples:

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
...

Há dois Where-Object elementos no comando acima, mas eles podem ser expressos em um único Where-Object elemento usando o -and operador lógico, assim:

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

Os operadores lógicos padrão estão listados na tabela a seguir.

Operador lógico Significado Exemplo (retorna true)
-and Lógica e; true se ambos os lados forem verdadeiros (1 -eq 1) -and (2 -eq 2)
-or Lógico ou; true se qualquer um dos lados for verdadeiro (1 -eq 1) -or (1 -eq 2)
-not Lógico que não; inverte verdadeiro e falso -not (1 -eq 2)
! Lógico que não; inverte verdadeiro e falso !(1 -eq 2)