Cómo usar la propiedad Expand de PowerShell para Select-Object

El cmdlet Select-Object de PowerShell te permite seleccionar de manera eficiente objetos y propiedades de un grupo de objetos de entrada. Pero a veces, necesitas conocer más. El interruptor ExpandProperty es un cambio para Select-Object que amplía los detalles sobre una propiedad específica.

Descubre el poder del interruptor PowerShell Expand Property (-ExpandProperty) en este tutorial guiado por ejemplos.

Prerrequisitos

Este tutorial será una demostración práctica. Si quieres seguir, todo lo que necesitas es una máquina con Windows con PowerShell 5.1 o superior. Este artículo utiliza una máquina con Windows 10 y PowerShell 5.1.

Extracción de valores de objetos de propiedad con PowerShell Expand Property

Inicia sesión en tu máquina con Windows y abre una terminal de PowerShell. En esta sección, te familiarizarás con el cmdlet Select-Object y su interruptor ExpandProperty.

1. Ejecuta el cmdlet Get-Service para obtener una lista de todos los servicios en tu sistema. Envia la salida al cmdlet Select-Object para seleccionar y mostrar solo la propiedad de nombre de cada objeto de servicio, como se muestra a continuación.

Get-Service | Select-Object -Property Name

Ahora deberías ver una única columna de objetos que representan una lista de nombres de servicios en tu sistema, como se muestra en la captura truncada a continuación.

Selecting the names of the existing system services

2. Ejecute el cmdlet Get-Member al final del pipeline anterior para confirmar el tipo de objetos que devuelve select-object como se muestra a continuación. Saber el tipo de objeto ayuda a escribir funciones o cmdlets para extender sus pipelines.

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

Consulte la captura de pantalla a continuación y notará que aunque el interruptor -Property produce lo que parece ser una lista de cadenas, estas son la lista Seleccionada de objetos System.ServiceProcess.ServiceController.

Viewing the type of a ServiceController object with Get-Member

3. Reemplace el cmdlet Get-Members con mkdir para crear automáticamente una carpeta para cada servicio. El interruptor -first 5 limita la cantidad de objetos a devolver. A su vez, la función mkdir solo creará cinco carpetas basadas en los objetos en el pipeline.

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

Debería ver una salida similar a la captura de pantalla a continuación, lo que indica el intento exitoso.

Creating a folder for the services on your system

4. Elimine las carpetas reemplazando mkdir con rmdir como en el fragmento a continuación. Active el interruptor -Verbose para mostrar una salida detallada en su terminal.

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

El cmdlet rmdir espera cadenas y no puede manejar la representación de objetos ServiceController como un hashtable. Tu intento debería fallar con varios errores, como se muestra en la captura de pantalla a continuación.

Demonstrating that some cmdlets expect string values instead of hashtables

5. Cambia el interruptor -Property al interruptor -ExpandProperty como en el siguiente fragmento. Al hacerlo, te permite obtener el valor de una propiedad como una cadena cuando todo lo que necesitas es una cadena.

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

Combinado con rmdir, deberías ver que tu intento de eliminar automáticamente las carpetas tenga éxito sin errores, como se muestra en la captura de pantalla a continuación.

Deleting folders named after the services expanded

Creando un conjunto de objetos seleccionados con propiedades específicas

Para acortar los fragmentos de código en las secciones, crea una variable para los primeros 20 servicios en tu máquina de la siguiente manera.

Ejecuta el comando Get-Service, selecciona los primeros 20 objetos a través del cmdlet Select-Object y almacena los objetos en una variable llamada $testServices. Selecciona solo las propiedades Name, Status y DependentServices de la siguiente manera.

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

El interruptor de propiedad Expand de PowerShell solo puede expandir una propiedad a la vez, a diferencia del interruptor de propiedad que puede seleccionar más de una propiedad simultáneamente.

Ejecute el nombre de variable, $testServices, para ver la estructura de sus contenidos.

$testServices

Debería ver una tabla que muestra las propiedades de los servicios que seleccionó, similar a la captura de pantalla a continuación.

Displaying the contents of $testServices

Expandir una propiedad de colección con 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.

Ejecute el cmdlet Select-Object en la variable $testServices y expanda la propiedad DependentServices de cada servicio.

$testServices | Select-Object -ExpandProperty DependentServices

Dado que DependentServices es una propiedad de colección, la salida es una lista de los servicios en todas las colecciones pobladas, como se muestra a continuación. Observe los duplicados en la lista debido a la concatenación de resultados de la DependentServices expandida.

Expanding the DependentServices property

Combinación de propiedad con PowerShell Expand Property para una salida categorizada

Ahora tiene una lista de servicios dependientes, pero ¿cómo sabe en qué servicio dependen? En esta sección, aprenderá a usar el interruptor -Property para categorizar una propiedad expandida.

Ejecute el siguiente comando para categorizar las propiedades DependentServices por Name.

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

Dado que los servicios dependientes ya tienen una propiedad Name, el paso de categorización falla, como se muestra a continuación.

El error a continuación le indica que la lista inicial de servicios (en $testServices) ya tiene una propiedad Name en conflicto con una propiedad Name en la propiedad DependentServices expandida.

Attempting to group an expanded property by the parent object name

Una solución alternativa es crear Propiedades Calculadas para renombrar la propiedad identificador de la siguiente manera.

Guarde la salida del comando anterior modificada para especificar una propiedad calculada llamada “Depende de” como la propiedad identificadora en una variable llamada $depServ. “Depende de” contendrá el valor del nombre para cada servicio en $testService.

El nombre de la propiedad, Depende de, fue elegido arbitrariamente en este tutorial y puede ser cualquier expresión de su elección.

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

Pase el objeto en $depServ a través de Select-Object para seleccionar la propiedad Nombre, Estado y Depende de del servicio dependiente.

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

Ahora puede ver qué servicios dependen de los servicios en $testServices, como se muestra a continuación.

Grouping an expanded property using a calculated property

Combinando Format-List con PowerShell Expand Property para Verbosidad

PowerShell puede limitar qué propiedades de objeto mostrar, especialmente en la salida tabular, y la salida del interruptor -ExpandProperty puede experimentar lo mismo. Puede mostrar las propiedades expandidas en una lista en lugar de en una tabla como solución alternativa.

Ejecute el cmdlet Get-Process a continuación para recuperar todos los módulos que el proceso explorer utiliza. Active el interruptor -ExpandProperty para mostrar las propiedades de los módulos.

Get-Process explorer | select-object -ExpandProperty Modules

La salida en su pantalla debería parecerse a la captura de pantalla siguiente, truncada automáticamente para mostrar solo tres propiedades.

Viewing the truncated output of an expanded property

Pase los objetos al cmdlet Format-List para ver todos los valores de los objetos del módulo en una lista más manejable.

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

Como se muestra a continuación, la salida enumera todas las propiedades y sus valores. Puede guardar los datos en un archivo o pasarlos a otro cmdlet para su procesamiento adicional.

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

Conclusión

Al llegar con éxito a este punto, ha visto cómo beneficiarse del interruptor de propiedad Expand de PowerShell (-ExpandProperty) del cmdlet Select-Object. PowerShell ofrece una serie de cmdlets útiles para muchas tareas comunes. Puede aumentar sus nuevos conocimientos aprendiendo cómo mostrar archivos con PowerShell Cat rápidamente.

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