Como usar a propriedade Expand do PowerShell para o Select-Object

O cmdlet Select-Object do PowerShell permite que você escolha objetos e propriedades de um grupo de objetos de entrada de forma transparente. 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 Expand Property (-ExpandProperty) do PowerShell neste tutorial conduzido por exemplos.

Pré-requisitos

Este tutorial será uma demonstração prática. Se você quiser acompanhar, tudo o 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 Objetos de Propriedade com o Expand Property do PowerShell

Faça login na 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 no 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, como 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 no 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 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 o switch -Property gere o que parece ser uma lista de strings, essas são a lista Selecionada 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. O switch -first 5 limita o número de objetos a retornar. Por sua vez, a função mkdir só criará 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 como no trecho abaixo. Ative o switch -Verbose para mostrar uma 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 hashtable dos objetos ServiceController. 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 o interruptor -Property para o interruptor -ExpandProperty conforme no trecho a seguir. Fazendo isso permite que você obtenha o valor de uma propriedade como uma string quando tudo o 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 maneira.

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

O interruptor PowerShell Expand Property só pode expandir uma propriedade de cada vez, ao contrário do interruptor Property, que pode selecionar mais de uma propriedade simultaneamente.

Execute o nome da 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, semelhante à captura de tela abaixo.

Displaying the contents of $testServices

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

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, como mostrado abaixo. Observe as duplicatas na lista devido à concatenação dos resultados da propriedade expandida DependentServices.

Expanding the DependentServices property

Combinando Propriedades com PowerShell Expand Property para Saída Categorizada

Agora você tem uma lista de serviços dependentes, mas como saber em quais serviços 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

Como os serviços dependentes já possuem uma propriedade Name, a etapa de categorização falha, como mostrado abaixo.

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

Attempting to group an expanded property by the parent object name

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

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

O nome da propriedade, Depende de, 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 de serviço dependentes Name, Status e Depende de.

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

Agora você pode ver 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 do objeto exibir, especialmente na saída tabular, e a saída do switch -ExpandProperty pode ter o mesmo problema. Como solução alternativa, você pode mostrar as propriedades expandidas em uma lista.

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 sua tela deve se assemelhar à captura de tela a seguir, automaticamente truncada para exibir apenas três propriedades.

Viewing the truncated output of an expanded property

Passe 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

Como 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/