19Aug
En esta edición de Geek School, analizamos el formateo, el filtrado y la comparación de objetos en Pipeline.
Asegúrese de leer los artículos anteriores de la serie:
- Aprenda a automatizar Windows con PowerShell
- Aprenda a usar los cmdlets en PowerShell
- Aprenda a usar objetos en PowerShell
Y esté atento al resto de la serie durante toda la semana.
Formato predeterminado
Cuando comencé con PowerShell, pensé que todo era mágico, pero la verdad es que solo lleva un poco de tiempo entender lo que sucede debajo del capó.Lo mismo es cierto para el sistema de formateo de PowerShell. De hecho, si ejecuta el cmdlet Get-Service, la salida generada solo muestra 3 propiedades: Status, Name y DisplayName.
Pero si canaliza Get-Service a Get-Member, verá que los objetos ServiceController tienen mucho más que solo estas tres propiedades, entonces, ¿qué está pasando?
La respuesta se encuentra dentro de un archivo oculto que define cómo la mayoría de los cmdlets incorporados muestran su salida. Para entender, escriba lo siguiente en el intérprete de comandos y presione enter. Bloc de notas de
C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ DotNetTypes.format.ps1xml
Si usamos la función de búsqueda de Bloc de notas, podemos pasar rápidamente a la sección que detalla el resultado del cmdlet Get-Service al buscar ServiceControllertipo.
De repente, puede ver que debajo del capó PowerShell está formateando todos los objetos en el Pipeline que son del tipo ServiceController y creando una tabla con tres columnas: Status, Name y DisplayName. Pero, ¿qué pasa si el tipo con el que está tratando no tiene una entrada en ese archivo, o cualquier otro archivo de formato para el caso? Bueno, en realidad es bastante simple. Si el objeto que sale de la tubería tiene 5 o más propiedades, PowerShell muestra todas las propiedades del objeto en una lista;si tiene menos de 5 propiedades, las muestra en una tabla.
Formateo de sus datos
Si no está satisfecho con el formateo predeterminado de un objeto o tipo, puede desplegar su propio formato. Hay tres cmdlets que necesita saber para hacer esto.
- Format-List
- Format-Table
- Format-Wide
Format-Wide simplemente toma una colección de objetos y muestra una sola propiedad de cada objeto. Por defecto, buscará una propiedad de nombre;si sus objetos no contienen una propiedad de nombre, utilizará la primera propiedad del objeto una vez que las propiedades se hayan ordenado alfabéticamente.
Get-Service |Format-Wide
Como puede ver, también tiene dos columnas predeterminadas, aunque puede especificar qué propiedad desea usar, así como también cuántas columnas quiere que se muestren.
Get-Service |Format-Wide -Property DisplayName -Column 6
Si algo tiene el formato de una tabla de forma predeterminada, siempre puede cambiarlo a la vista de lista mediante el uso del cmdlet Format-List. Echemos un vistazo al resultado del cmdlet Get-Process.
Esta vista tabular realmente se adapta muy bien a este tipo de información, pero imaginemos que queremos verla en forma de lista. Todo lo que tenemos que hacer es conectarlo a Format-List .
Get-Process |Format-List
Como puede ver, solo se muestran cuatro elementos en la lista de forma predeterminada. Para ver todas las propiedades del objeto, puede usar un carácter comodín.
Get-Process |Format-List -Property *
Alternativamente, puede seleccionar solo las propiedades que desee.
Get-Process |Format-List -Property name, id
Format-Table, , por otro lado, toma datos y los convierte en una tabla. Como nuestros datos de Get-Process ya están en forma de tabla, podemos usarlos para elegir fácilmente las propiedades que queremos que se muestren en la tabla. Utilicé el parámetro AutoSize para que todos los datos encajen en una sola pantalla.
Get-Process |Format-Table name, id -AutoSize
Filtrado y comparación de
Una de las mejores ventajas de usar una tubería basada en objetos es que puede filtrar los objetos de la interconexión en cualquier etapa mediante el cmdlet Where-Object.
Get-Service |Where-Object{ $ _. Status -eq "Running"}
Usar donde objeto es realmente muy simple.$ _ representa el objeto de canalización actual, desde el que puede elegir una propiedad que desea filtrar. Aquí, solo guardamos objetos donde la propiedad Status equivale a Running. Hay algunos operadores de comparación que puede usar en el bloque de script de filtrado:
- eq( Igual a)
- neq( No igual)
- gt( Mayor que)
- ge( Mayor o igual que)
- lt( Menor que)
- le( Menor o igual que)
- como( Asignación de cadena de comodines)
Se puede ver una lista completa y más información en el archivo de ayuda conceptual about_comparison, sin embargo, lleva un tiempo acostumbrarse a la sintaxis Where-Obeject.¡Eso es todo por esta vez!