- 12/23/2019
- 4 minutos para ler
-
- j
- s
- m
In PowerShell, muitas vezes você gera e passa mais objetos para um pipeline do que você quer. Você pode especificar as propriedades de determinados objetos a serem exibidos usando os Format-*
cmdlets, mas isso não ajuda com o problema de remover objetos inteiros da exibição. Você pode querer filtrar objetos antes do final de um pipeline, para que você possa executar ações apenas em um subconjunto de objetos gerados inicialmente.
PowerShell inclui uma Where-Object
cmdlet que permite testar cada objeto no pipeline e apenas 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 da tubulação. Você fornece a condição de teste como o valor do parâmetroFilterScript.
Executar testes simples com Where-Object
O valor do FilterScript é um bloco de script – um ou mais comandos PowerShell rodeados de bybraces ({}
) – que avalia como verdadeiro ou falso. Estes blocos de scripts podem ser muito simples, mas para criá-los é necessário conhecer outro conceito PowerShell, operadores de comparação. Um operador de comparação compara os itens que aparecem em cada lado do mesmo. Os operadores de comparação começam com um hífen (-
) e são seguidos por um nome. Operadores de comparação básicos trabalham em quase todos os tipos de objetos. Os operadores de comparação mais avançados podem trabalhar apenas em texto ou arrays.
Nota
Por padrão, quando se trabalha com texto, os operadores de comparação PowerShell são insensíveis a maiúsculas e minúsculas.
Due to parsing considerations, 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 | Medição | Exemplo (retorna verdadeiro) |
---|---|---|
-ne | 1 -ne 2 | |
É inferior a | ||
2 -gt 1 | ||
“file.doc” -não como “p*.doc” | ||
contém | ||
Where-Object
blocos de script use a variável especial $_
para se referir ao objeto atual na linha de navegação. Aqui está um exemplo de como ele funciona. Se você tem uma lista de números, e só quer retornar 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}12
Filtragem baseada nas propriedades do objeto
Desde que $_
se refira ao objeto 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 sistema em particular, mas você pode estar interessado apenas em um conjunto particular de drivers de sistema, como os que estão rodando atualmente. Para a classe Win32_SystemDriver, a propriedade relevante é State. Você pode filtrar os drivers de sistema, selecionando apenas os que estão em execução digitando:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq 'Running'}
Isso ainda produz uma longa lista. Você pode querer filtrar para selecionar apenas os drivers definidos como startautomaticamente testando também o valor do StartMode:
Get-CimInstance -Class Win32_SystemDriver | Where-Object {$_.State -eq "Running"} | Where-Object {$_.StartMode -eq "Auto"}
DisplayName : RAS Asynchronous Media DriverName : AsyncMacState : RunningStatus : OKStarted : TrueDisplayName : Audio Stub DriverName : audstubState : RunningStatus : OKStarted : True...
Isso nos dá muitas informações que não precisamos mais porque sabemos que os drivers estão rodando. O comando seguinte 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 Driverbindflt Windows Bind Filter Driverbowser BrowserCompositeBus Composite Bus Enumerator Drivercondrv Console DriverHdAudAddService Microsoft 1.1 UAA Function Driver for High Definition Audio ServiceHDAudBus Microsoft UAA Bus Driver for High Definition AudioHidUsb Microsoft HID Class DriverHTTP HTTP Serviceigfx igfxIntcDAud Intel(R) Display Audiointelppm Intel Processor Driver...
Existem dois elementos Where-Object
no comando acima, mas eles podem ser expressos em um único elementoWhere-Object
usando o operador lógico -and
, como este:
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 | Medição | Exemplo (retorna verdadeiro) |
---|---|---|