Quando você trabalha com valores de propriedade em uma coleção de objetos no PowerShell, às vezes você precisará de uma maneira de filtrar tudo o que você não precisa. Saber como usar o cmdlet Where-Object
do PowerShell é uma habilidade importante para ter em sua caixa de ferramentas do PowerShell.
O cmdlet Where-Object
é uma maneira útil de filtrar objetos. Neste tutorial, você aprenderá diferentes maneiras de construir um comando Where-Object
, seus parâmetros disponíveis, sintaxe, bem como como usar múltiplas condições como um profissional!
Pré-requisitos
Há apenas um pré-requisito para este artigo. Você deve ter alguma familiaridade básica com os comandos e sintaxe do PowerShell.
Todos os exemplos neste artigo serão baseados na versão estável atual do PowerShell (7.1.0 no momento da escrita). Mas desde que você tenha o Windows PowerShell 4.0 ou superior, os comandos funcionarão da mesma forma.
Entendendo Como Funciona o Where-Object do PowerShell
O único objetivo do cmdlet Where-Object
do PowerShell é filtrar a saída que um comando retorna para retornar apenas as informações que você deseja ver.
Em poucas palavras, o cmdlet Where-Object
é um filtro; é isso. Ele permite que você construa uma condição que retorna Verdadeiro ou Falso. Dependendo do resultado dessa condição, o cmdlet então retorna a saída ou não.
Você pode criar essa condição de uma de duas maneiras; da forma “antiga” com blocos de script e da forma “nova” usando parâmetros ou declarações de comparação.
Criando Condições de Filtro com Blocos de Script
Os blocos de script são um componente chave no PowerShell. Eles são usados em centenas de lugares ao longo da linguagem. Um bloco de script é uma função anônima. É uma forma de compartimentar código e executá-lo em vários lugares. Você pode construir um filtro para Where-Object
via um bloco de script.
Para usar um bloco de script como filtro, você usaria o parâmetro FilterScript
. Este parâmetro permite que você crie e passe um bloco de script para o parâmetro FilterScript
que será então executado.
Se o bloco de script retornar um valor diferente de Falso booleano ou uma variável nula, ele é considerado Verdadeiro. Caso contrário, é considerado Falso.
Por exemplo, digamos que você precise encontrar todos os serviços do Windows que atualmente têm um tipo de inicialização Automática. Primeiro, você reuniria todos os serviços atuais com Get-Service
. Get-Service
então retorna muitos objetos de serviço diferentes com várias propriedades.
Usando o pipeline do PowerShell, você poderia então encaminhar esses objetos para o cmdlet Where-Object
e usar o parâmetro FilterScript
. Como o parâmetro FilterScript
aceita um scriptblock, você poderia criar uma condição para verificar se a propriedade StartType
de cada objeto é igual a Automatic como abaixo.
Uma vez que você tenha o scriptblock de filtragem, você então forneceria esse scriptblock ao parâmetro FilterScript
. O Where-Object
executaria esse scriptblock para cada objeto passando pelo pipeline e avaliaria cada propriedade StartType
. Se a propriedade for igual a Automatic, o Where-Object
passaria o objeto adiante. Caso contrário, o objeto seria descartado.
Você pode ver um exemplo simples dessa metodologia abaixo.

Muitas pessoas usam parâmetros posicionais com o cmdlet
Where-Object
e não incluem o nome do parâmetroFilterScript
. Em vez disso, eles simplesmente fornecem o scriptblock sozinho comoWhere-Object {$_.StartType -eq 'Automatic'}
.
Embora esse tipo de construção funcione para este cenário particular. O conceito de um scriptblock com as chaves ou mesmo a variável de pipeline $_
torna o código menos legível e mais difícil para usuários do PowerShell menos experientes. Esse problema de legibilidade foi o que levou a equipe do PowerShell a introduzir parâmetros ou declarações de comparação.
Declarações de Comparação
Apresentado no Windows PowerShell 3.0, as declarações de comparação têm um fluxo mais natural na forma como são construídas. Usando o mesmo cenário do exemplo anterior, vamos usar a construção de declaração de comparação para encontrar todos os serviços do Windows com um tipo de inicialização Automático:
Observe acima que, em vez de usar um scriptblock, o comando especifica a propriedade do objeto como um valor de parâmetro para o parâmetro Property
. O operador eq
agora é um parâmetro também, permitindo que você passe o valor de Automático para ele.
Usar parâmetros dessa maneira elimina agora a necessidade de um scriptblock inteiramente.
A scriptblock is a better choice when defining more complex filtering conditions. The
Property
parameter may not always be the best choice. If using a scriptblock, just remember to document your code using comments!
Na próxima seção, você aprenderá sobre os tipos de operadores de comparação disponíveis que podem ser usados com Where-Object
para filtrar todas as coisas.
Fundamentos da Filtragem
Usando parâmetros, Where-Object
filtra coleções de objetos usando operadores de comparação comuns. Vamos mergulhar em alguns exemplos de como eles funcionam.
Operadores de Contenção
Os operadores de contenção são úteis ao trabalhar com coleções. Operadores de contenção permitem que você defina uma condição se uma coleção contém um item ou não.
Como exemplo, digamos que você queira filtrar por um valor de propriedade particular em uma coleção. Você poderia usar operadores de contenção.
No PowerShell, você encontrará alguns operadores de contenção diferentes:
-contains
/-ccontains
– Filtra uma coleção contendo um valor de propriedade.-notcontains
/-cnotcontains
– Filtrar uma coleção que não contém um valor de propriedade.-in
/-cin
– valor está em uma coleção, retorna o valor da propriedade se houver uma correspondência.-notin
/-cnotin
– valor não está em uma coleção,null
/$false
se não houver valor de propriedade.
Para sensibilidade a maiúsculas e minúsculas, use operadores de contenção que começam com -c[operador]
Relacionado: Compreendendo Operadores de Comparação do PowerShell com Exemplos
Digamos que você queira verificar o status do serviço do Windows BITS. Você pode fazer isso usando o parâmetro (operador) contains
passando o valor de BITS como abaixo.
E abaixo é o que você esperaria ver:

Lembre-se sempre de filtrar à esquerda! O exemplo anterior é equivalente a executar
Get-Service -ServiceName 'BITS'
.
Talvez você queira ficar mais sofisticado e encontrar todos os serviços com um Status que não é Running e um StartType que está in em uma única string (ou pode ser uma matriz) chamada Manual. Usando um scriptblock abaixo, o comando está usando o parâmetro FilterScript
para passar um scriptblock que avalia ambas as condições.
Relacionado: Voltando ao Básico: Compreendendo Objetos do PowerShell
Quando você executa o comando acima, você verá apenas os serviços que estão parados e têm um StartType de Manual.

A filtragem com operadores de contenção funciona bem com coleções que contêm muitos valores de propriedade. Dada a quantidade de propriedades que Get-Service
retorna, a filtragem por todas essas propriedades fica mais fácil quando você combina operadores de contenção e operadores lógicos.
Operadores de Correspondência
Assim como você usa operadores de contenção com Where-Object
, você também pode usar operadores de correspondência. Operadores de correspondência permitem que você corresponda strings dentro de strings. Por exemplo, 'foofoo' -like '*foo*'
retorna Verdadeiro ou 'foofoo' -match 'foo'
retorna Verdadeiro. Operadores de correspondência correspondem strings em strings.
No PowerShell, você tem alguns operadores de correspondência diferentes que pode usar dentro do Where-Object
.
-like
/-clike
– a string corresponde a um padrão de caractere curinga.-notlike
/-cnotlike
– a string não corresponde ao padrão de caractere curinga.-match
/-cmatch
– a string corresponde ao padrão regex.-notmatch
/-cnotmatch
– a string não corresponde ao padrão regex
Para sensibilidade a maiúsculas e minúsculas, use operadores de correspondência que começam com
-c[operador]
Quase idênticos em forma aos operadores de contenção, você pode usar operadores de correspondência como mostrado abaixo. O exemplo abaixo encontra todos os serviços que têm Windows no valor da propriedade DisplayName.

match
operator uses regular expressions to match on certain values.Relacionado: Começando com PowerShell e Regex
Você também pode usar o operador like
para utilizar técnicas de correspondência comuns, como usar um caractere curinga (*
) para corresponder a qualquer caractere ou talvez um ?
para corresponder a um único caractere.
Agora os resultados estão filtrados apenas para aqueles nomes de serviço com ‘Win‘ como os três primeiros caracteres:

O uso do caractere curinga significa que você não precisa conhecer o nome completo do serviço. Algumas letras da string são tudo o que é necessário. Esses operadores também podem ser combinados com operadores lógicos para aprimorar ainda mais a filtragem.
Operadores de Igualdade
Similar ao uso dos operadores de contenção e comparação, você também pode usar operadores de igualdade com Where-Object
. Os operadores de igualdade são úteis ao precisar comparar valores numéricos.
Por exemplo, 1 -eq 1
seria Verdadeiro enquanto 1 -gt 2
seria Falso. O PowerShell tem muitos operadores de igualdade diferentes que você pode usar como parâmetros de Where-Object
ou dentro de scriptblocks de condição.
-eq
/-ceq
– valor igual ao valor especificado.-ne
/-cne
– valor não igual ao valor especificado.-gt
/-cgt
– valor maior que o valor especificado.-ge
/-cge
– valor maior ou igual ao valor especificado.-lt
/-clt
– valor menor que o valor especificado.-le
/-cle
– valor menor ou igual ao valor especificado.
Por exemplo, talvez você queira encontrar todos os processos em execução que estão consumindo entre dois e dez por cento de sua CPU. Sem problemas com os cmdlets do PowerShell Get-Process
e Where-Object
.
Usando um scriptblock, você pode combinar duas condições usando o operador and
, que as avaliará ambas. Se ambas retornarem True, Where-Object
retornará o objeto do processo passado pela canalização. Se pelo menos uma das condições retornar False, Where-Object
descarta o objeto.
Aqui está o que você esperaria ver:

Filtrar usando os operadores de igualdade do Where-Object
ajudará você a construir relatórios do sistema ou comparar valores.
Próximos Passos
Agora que você sabe mais sobre como usar o cmdlet Where-Object
do PowerShell para filtrar todas as coisas, o que mais você pode fazer? Experimente algumas tarefas de filtragem mais complexas usando múltiplas condições e operadores em coleções para filtrar os valores das propriedades e formatar a saída de acordo com suas preferências.
Source:
https://adamtheautomator.com/powershell-where-object/