Dominando o PowerShell Where-Object: Um Guia Abrangente

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.

{$_.StartType -EQ 'Automatic'}

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.

Get-Service | Where-Object -FilterScript {$_.StartType -EQ 'Automatic'}
Script Block construct

Muitas pessoas usam parâmetros posicionais com o cmdlet Where-Object e não incluem o nome do parâmetro FilterScript. Em vez disso, eles simplesmente fornecem o scriptblock sozinho como Where-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:

Get-Service | Where-Object -Property StartType -EQ 'Automatic'

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.

Get-Service | Where-Object -Property Name -Contains 'BITS'

E abaixo é o que você esperaria ver:

Where-Object equivalent to Get-Service -ServiceName ‘BITS’

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

Get-Service |
	Where-Object {($_.Status -notcontains 'Running') -and ($_.StartType -in 'Manual')}

Quando você executa o comando acima, você verá apenas os serviços que estão parados e têm um StartType de Manual.

More advanced filtering of a collection of objects

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.

Get-Service | Where-Object { $_.DisplayName -match 'Windows'}
The 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.

Get-Service | Where-Object {($_.Name -like 'Win*')}

Agora os resultados estão filtrados apenas para aqueles nomes de serviço com ‘Win‘ como os três primeiros caracteres:

service names with ‘Win

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.

Get-Process | Where-Object {($_.CPU -gt 2.0) -and ($_.CPU -lt 10)}

Aqui está o que você esperaria ver:

Filtering with greater than and less than

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/