Remoção de objetos do pipeline
No PowerShell, você muitas vezes gera e passa mais objetos para um pipeline do que deseja. É possível especificar as propriedades de determinados objetos para exibição usando os cmdlets Format-*
, mas isso não ajuda em problemas de remoção de objetos inteiros da exibição. Talvez você queira filtrar objetos antes do final de um pipeline para poder executar ações em apenas um subconjunto dos objetos gerados inicialmente.
O PowerShell inclui um cmdlet Where-Object
que permite testar cada objeto no pipeline e apenas passá-lo pelo pipeline caso ele atenda a determinada condição de teste. Objetos que não passarem no teste são removidos do pipeline. Forneça a condição de teste como o valor do parâmetro FilterScript.
Execução de testes simples com Where-Object
O valor de FilterScript é um bloco de script – um ou mais comandos do PowerShell entre chaves ({}
) – que é avaliado como verdadeiro ou falso. Esses blocos de script podem ser simples, mas criá-los requer conhecimento sobre outro conceito do PowerShell, os operadores de comparação. Um operador de comparação compara os itens que aparecem em cada lado dela. Os operadores de comparação começam com um caractere de hífen (-
) e são seguidos por um nome. Operadores de comparação básicos funcionam em praticamente qualquer tipo de objeto. Os operadores de comparação mais avançados podem funcionar apenas em texto ou matrizes.
Observação
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 de comparação básicos estão listados na tabela a seguir.
Operador de Comparação | Significado | Exemplo (returna 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 |
-like | É como (curinga de comparação para texto) | "file.doc" -like "f*.do?" |
-notlike | não é como (curinga de comparação de texto) | "file.doc" -notlike "p*.doc" |
-contains | Contém | 1,2,3 -contains 1 |
-notcontains | não contém | 1,2,3 -notcontains 4 |
Os blocos de script de Where-Object
usam a variável especial $_
para fazer referência ao objeto atual no pipeline. Veja um exemplo de como isso funciona. Se você tiver uma lista de números e quiser retornar apenas os inferiores a três, poderá usar Where-Object
para filtrar os números digitando:
1,2,3,4 | Where-Object {$_ -lt 3}
1
2
Filtragem com base nas propriedades de objeto
Como $_
se refere ao objeto atual no pipeline, podemos acessar suas propriedades para nossos testes.
Por exemplo, podemos ver a classe Win32_SystemDriver no WMI. Pode haver centenas de drivers de sistema em um sistema específico, 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 aqueles em execução digitando:
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq 'Running'}
Isso ainda produz uma longa lista. Você pode filtrar para escolher apenas os drivers definidos para iniciar automaticamente testando também o valor de 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
...
Isso nos fornece muitas informações que já não precisamos mais porque sabemos que os drivers estão sendo executados. Na verdade, a única informação que é provavelmente precisamos neste ponto é o nome e o nome de exibição. O comando a seguir inclui somente 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 elementos Where-Object
no comando acima, mas eles podem ser expressados em um único elemento Where-Object
usando o operador lógico -and
, desta forma:
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 são listados na tabela a seguir.
Operador Lógico | Significado | Exemplo (returna true) |
---|---|---|
-and |
E lógico; verdadeiro se ambos os lados forem verdadeiros | (1 -eq 1) -and (2 -eq 2) |
-or |
Ou lógico; verdadeiro se um dos lados for verdadeiro | (1 -eq 1) -or (1 -eq 2) |
-not |
Não lógico; inverte o verdadeiro e o falso | -not (1 -eq 2) |
! |
Não lógico; inverte o verdadeiro e o falso | !(1 -eq 2) |