Como usar a Propriedade Expand do PowerShell para Select-Object

O cmdlet Select-Object do PowerShell permite que você escolha objetos e propriedades de forma fácil a partir de um grupo de objetos de entrada. Mas às vezes você precisa saber mais. O ExpandProperty é um interruptor para o Select-Object que expande detalhes sobre uma propriedade específica.

Descubra o poder do interruptor ExpandProperty do PowerShell (-ExpandProperty) neste tutorial conduzido por exemplos.

Pré-requisitos

Este tutorial será uma demonstração prática. Se você deseja acompanhar, tudo que você precisa é de uma Máquina Windows com PowerShell 5.1 ou superior. Este artigo usa uma máquina Windows 10 com PowerShell 5.1.

Extraindo Valores de Propriedade de Objetos com o Expand Property do PowerShell

Faça login em sua máquina Windows e abra um terminal do PowerShell. Nesta seção, você se familiarizará com o cmdlet Select-Object e seu interruptor ExpandProperty.

1. Execute o cmdlet Get-Service para obter uma lista de todos os serviços em seu sistema. Encaminhe a saída para o cmdlet Select-Object para selecionar e exibir apenas a propriedade de nome de cada objeto de serviço, conforme mostrado abaixo.

Get-Service | Select-Object -Property Name

Agora você deve ver uma única coluna de objetos representando uma lista de nomes de serviços em seu sistema, como na captura de tela truncada abaixo.

Selecting the names of the existing system services

2. Execute o cmdlet Get-Member no final do pipeline anterior para confirmar o tipo de objetos que o cmdlet select-object retorna conforme abaixo. Saber o tipo de objeto ajuda a escrever funções ou cmdlets para estender seus pipelines.

Get-Service | Select-Object -Property Name | Get-Member

Consulte a captura de tela abaixo e você notará que, embora a opção -Property produza o que parece ser uma lista de strings, essas são as listas Selecionadas de objetos System.ServiceProcess.ServiceController.

Viewing the type of a ServiceController object with Get-Member

3. Substitua o cmdlet Get-Members por mkdir para criar automaticamente uma pasta para cada serviço. A opção -first 5 limita o número de objetos a serem retornados. Por sua vez, a função mkdir criará apenas cinco pastas com base nos objetos no pipeline.

Get-Service | Select-Object -Property Name -First 5 | mkdir

Você deverá ver uma saída semelhante à captura de tela abaixo, indicando a tentativa bem-sucedida.

Creating a folder for the services on your system

4. Remova as pastas substituindo mkdir por rmdir conforme no trecho abaixo. Ative a opção -Verbose para mostrar saída detalhada no seu terminal.

Get-Service | Select-Object -Property Name -First 5 | rmdir -Verbose

O cmdlet rmdir espera strings e não consegue lidar com a representação de objetos ServiceController em hashtable. Sua tentativa deve falhar com vários erros, como na captura de tela abaixo.

Demonstrating that some cmdlets expect string values instead of hashtables

5. Altere a chave -Property para a chave -ExpandProperty, como no trecho a seguir. Isso permite obter o valor de uma propriedade como uma string quando tudo que você precisa é uma string.

Get-Service | Select-Object -ExpandProperty Name -First 5 | rmdir -Verbose

Combinado com rmdir, você deve ver sua tentativa de remover automaticamente as pastas ter sucesso sem erros, como na captura de tela abaixo.

Deleting folders named after the services expanded

Criando um Conjunto de Objetos Selecionados com Propriedades Específicas

Para encurtar os trechos de código nas seções, crie uma variável para os primeiros 20 serviços em sua máquina da seguinte forma.

Execute o comando Get-Service, selecione os primeiros 20 objetos via cmdlet Select-Object e armazene os objetos em uma variável chamada $testServices. Selecione apenas as propriedades Name, Status e DependentServices da seguinte forma.

$testServices = Get-Service | Select-Object -Property Name,Status,DependentServices -First 20

A chave PowerShell Expand Property só pode expandir uma propriedade de cada vez, ao contrário da chave Property, que pode selecionar mais de uma propriedade simultaneamente.

Execute a variável $testServices para visualizar a estrutura de seu conteúdo.

$testServices

Você deverá ver uma tabela exibindo as propriedades dos serviços que você selecionou, similar à captura de tela abaixo.

Displaying the contents of $testServices

Expandindo uma Propriedade de Coleção com o Comando Expand Property do PowerShell

A PowerShell object can have properties that are collections of objects, also known as collection properties. In this section, you will learn how to use PowerShell Expand Property to expand a collection property to view its members’ properties.

Execute o cmdlet Select-Object na variável $testServices e expanda a propriedade DependentServices de cada serviço.

$testServices | Select-Object -ExpandProperty DependentServices

Como DependentServices é uma propriedade de coleção, a saída será uma lista dos serviços em todas as coleções populadas, conforme mostrado abaixo. Note as duplicatas na lista devido à concatenação dos resultados da expansão de DependentServices.

Expanding the DependentServices property

Combinando Propriedade com o Comando Expand Property do PowerShell para Saída Categorizada

Agora você tem uma lista de serviços dependentes, mas como saber em qual serviço eles dependem? Nesta seção, você aprenderá a usar o switch -Property para categorizar uma propriedade expandida.

Execute o comando abaixo para categorizar as propriedades DependentServices por Name.

$testServices | Select-Object -ExpandProperty DependentServices -Property Name

Já que os serviços dependentes já têm uma propriedade Name, a etapa de categorização falha, conforme mostrado abaixo.

O erro abaixo informa que a lista inicial de serviços (em $testServices) já possui uma propriedade Name conflitante com uma propriedade Name na propriedade DependentServices expandida.

Attempting to group an expanded property by the parent object name

Um contorno é criar Propriedades Calculadas para renomear a propriedade identificadora da seguinte forma.

Salve a saída do comando anterior modificada para especificar uma propriedade calculada chamada Depends On como a propriedade identificadora em uma variável chamada $depServ. Depends On conterá o valor do Nome para cada serviço em $testService.

O nome da propriedade, Depends on, foi escolhido arbitrariamente neste tutorial e pode ser qualquer expressão de sua escolha.

$depServ = $testServices | Select-Object -ExpandProperty DependentServices -Property @{name="Depends On"; expr={$_.Name}}

Passe o objeto em $depServ através do Select-Object para selecionar as propriedades do serviço dependente Name, Status e Depends On.

$depServ | Select-Object -Property Name,Status,"Depends On"

Agora você pode identificar quais serviços dependem dos serviços em $testServices, como mostrado abaixo.

Grouping an expanded property using a calculated property

Combinando Format-List com PowerShell Expand Property para Verbosidade

O PowerShell pode limitar quais propriedades de objetos exibir, especialmente na saída tabular, e a saída do switch -ExpandProperty pode ter a mesma limitação. Você pode mostrar as propriedades expandidas em uma lista como solução alternativa.

Execute o cmdlet Get-Process abaixo para recuperar todos os módulos que o processo explorer usa. Ative o switch -ExpandProperty para exibir as propriedades dos módulos.

Get-Process explorer | select-object -ExpandProperty Modules

A saída na tela deve se assemelhar à captura de tela abaixo, automaticamente truncada para exibir apenas três propriedades.

Viewing the truncated output of an expanded property

Encaminhe os objetos para o cmdlet Format-List para visualizar todos os valores dos objetos do módulo em uma lista mais gerenciável.

Get-Process explorer | select-object -ExpandProperty Modules | Format-List

Conforme mostrado abaixo, a saída lista todas as propriedades e seus valores. Você pode ainda salvar os dados em um arquivo ou passá-los para outro cmdlet para processamento adicional.

Converting the output of an expanded property to a list with Format-List

Conclusão

Ao chegar até aqui com sucesso, você viu como se beneficiar do switch de Propriedade Expandida do PowerShell (-ExpandProperty) do cmdlet Select-Object. O PowerShell oferece uma série de cmdlets úteis para muitas tarefas comuns. Você pode ampliar seu novo conhecimento aprendendo como exibir arquivos rapidamente com o PowerShell Cat.

Source:
https://adamtheautomator.com/powershell-expand-property/