No Windows PowerShell, quase sempre você gera e passa mais objetos para um pipeline do que realmente deseja. Você pode especificar as propriedades de objetos específicos a serem exibidas usando os cmdlets Format, mas isso não ajuda a remover todos os objetos da tela. Você pode querer filtrar objetos antes do final de um pipeline, e por isso executa ações em apenas um subconjunto dos objetos gerados inicialmente.

O Windows PowerShell inclui um cmdlet chamado Where-Object, que permite testar cada objeto no pipeline para passá-lo somente se ele atender a uma condição de teste específica. Os objetos que não passam no teste são removidos do pipeline. A condição do teste é fornecida como o valor do parâmetro Where-Object FilterScript .

Executando testes simples com Where-Object

O valor de FilterScript é um bloco de script - um ou mais comandos do Windows PowerShell entre chaves {} - que são avaliados como verdadeiro ou falso. Esses blocos de script podem ser muito simples, mas a sua criação requer conhecimentos sobre outro conceito do Windows PowerShell, os operadores de comparação. Um operador de comparação compara os itens que aparecem em cada um de seus lados. Operadores de comparação começam com um caractere '-' e são seguidos de um nome. Operadores de comparação básicos funcionam em praticamente qualquer tipo de objeto. Os operadores de comparação mais avançados só funcionam em texto ou em matrizes.

Observação:

Por padrão, quando trabalham com texto, os operadores de comparação do Windows PowerShell não diferenciam maiúsculas e minúsculas.

Devido a considerações de análise, símbolos como <,> e = não são usados como operadores de comparação. Em seu lugar, utilizamos letras. Os operadores de comparação básicos serão listados na tabela a seguir.

Operador de comparação Significado Exemplo (retorna verdadeiro)

-eq

É igual a

1 -eq 1

-ne

É diferente de

1 -ne 2

-lt

É menor do que

1 -lt 2

-le

É menor do que ou igual a

1 -le 2

-gt

É maior do que

2 -gt 1

-ge

É maior do que ou igual a

2 -ge 1

-like

É como (comparação de caracteres curinga para texto)

"file.doc" -like "f*.do?"

-notlike

Não é como (comparação de caracteres curinga para 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 Where-Object utilizam a variável especial '$_' para fazer referência ao objeto atual no pipeline. A seguir, um exemplo de como ele funciona. Se você tiver uma lista de números e quiser retornar somente aqueles que são menores do que 3, você poderá usar Where-Object para filtrá-los, digitando:

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

Filtrando objetos com base em suas propriedades

Uma vez que $_ se refere ao objeto atual do pipeline, podemos acessar suas propriedades para fazermos nossos testes.

Como exemplo, podemos observar a classe Win32_SystemDriver no WMI. Pode haver centenas de drivers de sistema em um sistema em particular, mas talvez você esteja interessado em um conjunto específico deles, como aqueles que estão em execução no momento. Se você usar Get-Member para exibir os membros de Win32_SystemDriver (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property), você verá que a propriedade relevante é State e que ela tem o valor "Running" quando o driver está em execução. É possível filtrar os drivers do sistema, selecionando apenas os que estão em execução, digitando:

Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}

Isso ainda produzirá uma lista muito longa. Talvez você queira criar outro filtro e selecionar apenas os drivers que possuem uma inicialização automática, testando também o valor de StartMode:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.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 dá muitas informações de que não precisamos mais, porque sabemos que os drivers estão em execução. Na realidade, as únicas informações de que provavelmente precisamos nesse momento são o nome e o nome para exibição. O comando a seguir inclui apenas essas duas propriedades, o que resulta em uma saída muito mais simples:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName

Name                                    DisplayName
----                                    -----------
AsyncMac                                RAS Asynchronous Media Driver
Fdc                                     Floppy Disk Controller Driver
Flpydisk                                Floppy Disk Driver
Gpc                                     Generic Packet Classifier
IpNat                                   IP Network Address Translator
mouhid                                  Mouse HID Driver
MRxDAV                                  WebDav Client Redirector
mssmbios                                Microsoft System Management BIOS Driver

Há dois elementos Where-Object no comando acima, mas eles podem ser expressos em um único elemento Where-Object com o uso do operador lógico -and, da seguinte forma:

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

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

Operador lógicos Significado Exemplo (retorna verdadeiro)

-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 verdadeiro e falso

-not (1 -eq 2)

!

Não lógico; inverte verdadeiro e falso

!(1 -eq 2)




Sumário