19Aug

Geek School: Learning Formatando, Filtrando e Comparando no PowerShell

Nesta edição da Geek School, analisamos a formatação, filtragem e comparação de objetos no Pipeline.

Certifique-se de ler os artigos anteriores da série:

  • Saiba como automatizar o Windows com o PowerShell
  • Aprender a usar Cmdlets no PowerShell
  • Como usar objetos no PowerShell

E fique atento para o resto da série durante toda a semana.

Formatação padrão

Quando comecei com o PowerShell, pensei que tudo era mágico, mas a verdade é que leva um pouco de tempo para entender o que está acontecendo por baixo do capô.O mesmo é verdadeiro para o sistema de formatação do PowerShell. Na verdade, se você executar o cmdlet Get-Service, a saída gerada somente mostra as 3 propriedades: Status, Nome e Nome de exibição.

Mas se você forçou Get-Service para Get-Member, você vê que os objetos do ServiceController têm muito mais do que apenas essas três propriedades, então, o que está acontecendo?

A resposta está dentro de um arquivo oculto que define como a maioria dos cmdlets embutidos exibem sua saída. Para entender, digite o seguinte no shell e pressione enter.

notepad C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ DotNetTypes.format.ps1xml

Se usamos a função Find do bloco de notas, podemos pular rapidamente para a seção que detalha a saída do cmdlet Get-Service procurando o ServiceControllertipo.

De repente, você pode ver que, embaixo do capô, o PowerShell está formatando quaisquer objetos no Pipeline que são do tipo ServiceController e criando uma tabela com três colunas: Status, Nome e DisplayName. Mas e se o tipo com o qual você está lidando não tiver uma entrada nesse arquivo ou qualquer outro arquivo de formato para esse assunto? Bem, então, é bastante simples na verdade. Se o objeto que sai da pipeline possui 5 ou mais propriedades, o PowerShell exibe todas as propriedades do objeto em uma lista;se tiver menos de 5 propriedades, ele os exibe em uma tabela.

Formatar seus dados

Se você não está feliz com a formatação padrão de um objeto ou tipo, você pode rolar sua própria formatação. Existem três cmdlets que você precisa saber para fazer isso.

  • Format-List
  • Format-Table
  • Format-Wide

Format-Wide simplesmente leva uma coleção de objetos e exibe uma única propriedade de cada objeto. Por padrão, ele procurará uma propriedade de nome;Se seus objetos não contêm uma propriedade de nome, ele usará a primeira propriedade do objeto uma vez que as propriedades foram classificadas em ordem alfabética.

Get-Service |Format-Wide

Como você pode ver, ele também é padrão para duas colunas, embora você possa especificar a propriedade que deseja usar, bem como a quantidade de colunas que deseja exibir.

Get-Service |Format-Wide -Propty DisplayName -Column 6

Se algo for formatado como uma tabela por padrão, você sempre pode alternar para exibição de lista usando o cmdlet Format-List. Vamos dar uma olhada na saída do cmdlet Get-Process.

Esta visão tabular realmente se adapta muito a este tipo de informação, mas vamos fingir que queremos visualizá-lo em forma de lista. Tudo o que realmente temos que fazer é transformá-lo em Format-List .

Get-Process |Lista de formatos

Como você pode ver, existem apenas quatro itens exibidos na lista por padrão. Para visualizar todas as propriedades do objeto, você pode usar um caractere curinga.

Get-Process |Format-List -Property *

Alternativamente, você pode selecionar apenas as propriedades desejadas.

Get-Process |Format-List -Property name, id

Format-Table, , por outro lado, leva dados e o transforma em uma tabela. Como nossos dados do Get-Process já estão na forma de uma tabela, podemos usá-lo para escolher facilmente as propriedades que queremos exibir na tabela. Utilizei o parâmetro AutoSize para ajustar todos os dados em uma única tela.

Get-Process |Nome da tabela de formatação, id -AutoSize

Filtragem e comparação de

Uma das melhores coisas sobre o uso de uma tubulação baseada em objeto é que você pode filtrar objetos fora da tubulação em qualquer etapa usando o cmdlet Where-Object.

Get-Service |Where-Object{ $ _. Status -eq "Running"}

Usando onde o objeto é realmente muito simples.$ _ representa o atual objeto do pipeline, a partir do qual você pode escolher uma propriedade na qual deseja filtrar. Aqui, estavam apenas guardando objetos em que a propriedade Status é igual a Running. Existem alguns operadores de comparação que você pode usar no bloco de script de filtragem:

  • eq( Igual a)
  • neq( Não igual a)
  • gt( Maior que)
  • ge( Maior ou igual a)
  • lt( Menos do que)
  • leo( menos ou igual a)
  • como( correspondência de caracteres de caracteres curinga)

Uma lista completa e mais informações podem ser visualizadas no arquivo de ajuda conceitual about_comparison, no entanto leva algum tempo a se acostumar com a sintaxe Where-Obeject. Isso é tudo por esse tempo!