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