Selecionar dados
A execução de um comando pode ser eficiente, pois você obtém dados do computador local ou da rede como um todo. Para ser ainda mais eficiente, você precisará saber como obter os dados desejados. A maioria dos comandos opera em objetos, como entrada, saída ou ambas. Os objetos têm propriedades cujos subconjuntos você pode querer acessar e apresentar em relatórios. Você também pode querer classificar os dados com base em uma ou mais propriedades. Mas como chegar lá?
Usar Get-Member para inspecionar a saída
Ao passar os resultados de um comando para Get-Member, o Get-Member retorna informações sobre um objeto como:
- O tipo de objeto que está sendo passado para Get-Member.
- As Propriedades do objeto que podem ser avaliadas.
- Os Métodos do objeto que podem ser executados.
Vamos demonstrar esse fato executando Get-Member no comando Get-Process.
Get-Process | Get-Member
Observe como você está usando o pipe | e que, ao chamar Get-Member, já está criando um pipeline. As primeiras linhas da saída da instrução anterior têm a seguinte aparência:
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize64
PM AliasProperty PM = PagedMemorySize64
SI AliasProperty SI = SessionId
VM AliasProperty VM = VirtualMemorySize64
WS AliasProperty WS = WorkingSet64
...
A saída mostra o tipo de objeto retornado pelo comando Get-Process (System.Diagnostics.Process). O restante da resposta mostra o nome, o tipo e a definição dos membros do objeto. É possível ver que, se você quiser ajustar Get-Process com outro comando em um pipeline, o emparelhamento dele com Get-Member será uma boa primeira etapa.
Select-Object
Por padrão, quando você executa um comando que vai gerar a saída na tela, o PowerShell adiciona automaticamente o comando Out-Default. Quando os dados de saída são uma coleção de objetos, o PowerShell analisa o tipo de objeto para determinar se há uma exibição registrada para esse tipo de objeto. Quando encontra uma exibição, ele a usa.
A exibição geralmente não contém todas as propriedades de um objeto, porque ele não será exibido corretamente na tela e, portanto, apenas algumas das propriedades mais comuns estão incluídas na exibição.
Você pode substituir a exibição padrão usando Select-Object e escolhendo sua própria lista de propriedades. Essas propriedades podem ser enviadas para Format-Table ou Format-List, para exibir a tabela da forma que você desejar.
Considere o resultado da execução Get-Process no processo zsh:
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 0.01 0.38 644 620 zsh
0 0.00 0.01 0.38 727 727 zsh
0 0.00 0.01 0.38 731 731 zsh
0 0.00 0.01 0.38 743 743 zsh
0 0.00 0.01 0.38 750 750 zsh
0 0.00 0.88 0.91 15747 …47 zsh
0 0.00 0.01 0.29 41983 …83 zsh
0 0.00 1.16 0.31 68298 …98 zsh
O que é apresentado é uma exibição que representa o que você provavelmente deseja ver nesse comando. No entanto, essa exibição não mostra um conjunto completo de informações. Para ver algo diferente, você pode especificar explicitamente quais propriedades deseja ver no resultado.
Obter a resposta completa
O que você viu até agora é uma resposta limitada. Para apresentar a resposta completa, use um caractere curinga *, da seguinte forma:
Get-Process zsh | Format-List -Property *
O caractere * mostra todos os atributos e o respectivo valor, o que permite investigar os valores nos quais você tem interesse. A resposta completa também usa nomes de apresentação para propriedades em vez dos nomes reais de propriedade, e os nomes de apresentação parecem bons em um relatório.
Apesar desses benefícios, talvez você não queira uma saída completa dos dados nem se contente com a resposta padrão.
Escolhendo colunas específicas
Para limitar a resposta e encontrar um meio termo entre a resposta padrão e a resposta completa, você deseja selecionar algumas propriedades nas quais está interessado e ter isso como entrada de parâmetro para Select-Object. Mas, e aqui está o problema, você precisa usar os nomes reais nas colunas. Como descobrir os nomes reais? Use Get-Member. Uma chamada para Get-Member fornece todas as propriedades e os nomes reais.
Localizar o nome real da propriedade
Vamos recapitular rapidamente a resposta padrão com este subconjunto:
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 0.01 0.38 644 620 zsh
A partir da resposta padrão, as propriedades Id e ProcessName são provavelmente chamadas da mesma forma, mas as CPUs são um nome de apresentação, os nomes de propriedade reais normalmente consistem apenas em caracteres de texto e sem espaços. Para descobrir o nome real de uma propriedade específica, pode-se usar Get-Member:
Get-Process zsh | Get-Member -Name C*
Obtém-se então uma lista de todos os membros com nomes que começam com C. Entre eles está CPU, que provavelmente é o que você quer:
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
CancelErrorRead Method void CancelErrorRead()
CancelOutputRead Method void CancelOutputRead()
Close Method void Close()
CloseMainWindow Method bool CloseMainWindow()
Container Property System.ComponentModel.IContainer Container {get;}
CommandLine ScriptProperty System.Object CommandLine {get=…
Company ScriptProperty System.Object Company {get=$this.Mainmodule.FileVersionInfo.CompanyName;}
CPU ScriptProperty System.Object CPU {get=$this.TotalProcessorTime.TotalSeconds;}
Agora você já sabe como usar o Select-Object para solicitar exatamente o que precisa com os nomes de propriedade corretos, desta forma:
Get-Process zsh | Select-Object -Property Id, Name, CPU
Aqui está:
Id Name CPU
-- ---- ---
644 zsh 0.3812141
727 zsh 0.3826498
731 zsh 0.3784953
743 zsh 0.3776352
750 zsh 0.3824036
15747 zsh 0.9097993
41983 zsh 0.2934763
68298 zsh 0.3121695
Esta sequência de comandos oferece uma saída diferente da saída padrão, mas que contém propriedades importantes para você.
Classificação
Quando você usa Sort-Object em um pipeline, o PowerShell classifica os dados de saída usando primeiro as propriedades padrão. Se nenhuma dessas propriedades existir, ele tentará comparar os próprios objetos. A classificação é por ordem crescente ou decrescente.
Ao fornecer propriedades, você pode optar por classificar por colunas específicas, desta forma:
Get-Process | Sort-Object -Descending -Property Name
No comando anterior, fizemos a classificação pela coluna Name em ordem decrescente. Para classificar por mais de uma coluna, separe os nomes das colunas com uma vírgula, desta forma:
Get-Process | Sort-Object -Descending -Property Name, CPU
Além de classificar por nome de coluna, também é possível fornecer sua própria expressão personalizada. Neste exemplo, usamos uma expressão personalizada para classificar pelas colunas Name e CPU e controlar a ordem de classificação de cada coluna.
Get-Process 'some process' | Sort-Object -Property @{Expression = "Name"; Descending = $True}, @{Expression = "CPU"; Descending = $False}
O exemplo anterior demonstra o quanto Sort-Object pode ser poderoso e flexível. Este assunto é um pouco avançado e está fora do escopo deste módulo, mas será retomado nos módulos mais avançados.