Quando você trabalha com valores de propriedades do PowerShell em uma coleção de objetos, às vezes você precisará de uma maneira de filtrar todas as coisas que 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 redação). Mas desde que você tenha o Windows PowerShell 4.0 ou superior, os comandos funcionarão da mesma forma.
Entendendo Como o Where-Object do PowerShell Funciona
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 suma, 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 das duas maneiras; a maneira “antiga” com scriptblocks e a maneira “nova” usando parâmetros ou declarações de comparação.
Criando Condições de Filtro com Scriptblocks
Scriptblocks são um componente chave no PowerShell. Scriptblocks são usados em centenas de lugares ao longo da linguagem. Um scriptblock é uma função anônima. É uma maneira de compartimentar o código e executá-lo em vários lugares. Você pode construir um filtro para Where-Object
via um scriptblock.
Para usar um scriptblock como filtro, você usaria o parâmetro FilterScript
. Este parâmetro permite que você crie e passe um scriptblock para o parâmetro FilterScript
que é então executado.
Se o scriptblock retornar um valor diferente de Falso booleano ou variável nula, ele é considerado Verdadeiro. Se não, é considerado Falso.
Por exemplo, digamos que você precise encontrar todos os serviços do Windows que atualmente têm um tipo de inicialização de Automático. Você primeiro reuniria todos os serviços atuais com Get-Service
. Get-Service
então retorna muitos objetos de serviço diferentes com várias propriedades.
Utilizando o pipeline do PowerShell, você pode direcionar esses objetos para o cmdlet Where-Object
e usar o parâmetro FilterScript
. Uma vez que o parâmetro FilterScript
aceita um scriptblock, você pode criar uma condição para verificar se a propriedade StartType
de cada objeto é igual a Automatic como abaixo.
Depois de ter o scriptblock de filtragem, você fornece esse scriptblock para o parâmetro FilterScript
. O Where-Object
executaria esse scriptblock para cada objeto que passa pelo pipeline e avaliaria cada propriedade StartType
. Se a propriedade for igual a Automatic, o Where-Object
passaria o objeto. 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, elas simplesmente fornecem o scriptblock sozinho, comoWhere-Object {$_.StartType -eq 'Automatic'}
.
Embora esse tipo de construção funcione para este cenário específico, o conceito de um scriptblock com as chaves ou até mesmo a variável do pipeline $_
torna o código menos legível e mais difícil para usuários menos experientes do PowerShell. 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
Introduzido no Windows PowerShell 3.0, os 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 da 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 bloco de script, o comando especifica a propriedade do objeto como um valor de parâmetro para o parâmetro Property
. O operador eq
agora é também um parâmetro que permite passar o valor de Automático para ele.
O uso de parâmetros dessa maneira agora elimina completamente a necessidade de um bloco de script.
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 o Where-Object
para filtrar todas as coisas.
Princípios básicos de filtragem
Usando parâmetros, o 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. Os 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 um valor de propriedade específico 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
– o valor está em uma coleção, retorna o valor da propriedade se houver correspondência.-notin
/-cnotin
– o 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: Entendendo Operadores de Comparação do PowerShell por Exemplo
Vamos dizer 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 para ele como abaixo.
E abaixo está 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 é Executando e um StartType que está em uma única string (ou poderia ser uma matriz) chamada Manual. Usando um bloco de script abaixo, o comando está usando o parâmetro FilterScript
para passar um bloco de script que avalia ambas as condições.
Relacionado: Voltando aos Fundamentos: Entendendo Objetos do PowerShell
Quando você executa o comando acima, 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. Dado o número de propriedades que o Get-Service
retorna, a filtragem por todas essas propriedades é facilitada quando você combina operadores de contenção e operadores lógicos.
Operadores de Correspondência
Semelhante a 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. Os operadores de correspondência correspondem a strings em strings.
No PowerShell, você tem alguns operadores de correspondência diferentes que pode usar dentro de Where-Object
.
-like
/-clike
– string corresponde a um padrão de caractere curinga.-notlike
/-cnotlike
– string não corresponde ao padrão de caractere curinga.-match
/-cmatch
– string corresponde ao padrão regex.-notmatch
/-cnotmatch
– 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 usar 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.
Os resultados agora 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 saber o nome completo do serviço. Poucas letras da cadeia são tudo o que é necessário. Esses operadores também podem ser combinados com operadores lógicos para aprimorar ainda mais o filtro.
Operadores de igualdade
Assim como para o uso de 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 blocos de script de condição.
-eq
/-ceq
– valor igual ao valor especificado.-ne
/-cne
– valor diferente do 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 estejam consumindo entre dois e 10 por cento da sua CPU. Não há problema com os cmdlets do PowerShell Get-Process
e Where-Object
.
Usando um scriptblock, você pode combinar duas condições juntas usando o operador and
que irá avaliá-las ambas. Se ambas retornarem Verdadeiro, Where-Object
retorna o objeto de processo passado pelo pipeline. Se pelo menos uma das condições retornar Falso, Where-Object
descarta o objeto.
Aqui está o que você esperaria ver:

Filtrar usando os operadores de igualdade do Where-Object
ajudará na construção de relatórios do sistema ou para comparação de 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? Tente algumas tarefas de filtragem mais complexas usando múltiplas condições e operadores em coleções para filtrar valores de propriedade e formatar a saída conforme sua preferência.
Source:
https://adamtheautomator.com/powershell-where-object/