- Windows PowerShell - Pipeline - Introducción -

WPS obtiene su potencia gracias a los pipelining, los cuales posibilitan la entrega de datos de un cmdlet a otro.
El pipelining está representado por una barra vertical o pipe "|", ejemplo:

Get-Process | Format-List

significa que los resultados del cmdlet "Get-Process", serán entregados a "Format-List". La salida estándar de "Get-Process" es una tabla. Con "Format-List", los valores de los procesos serán listados uno bajo el otro, en lugar de hacerlo en columnas.

La orientación a objetos en WPS se materializa en que la concatenación de cmdlets, vincula objetos .NET. Los pipelining orientados a objeto no dependen de la posición de las informaciones en el mismo.
En un pipelining como:

Get-Process | Where-Object { $_.name –eq "explorer" } | Format-Table ProcessName, WorkingSet

el tercer cmdlet no depende del ordenamiento o formateo de los resultados de cmdlets anteriores, sino que el hecha mano, sobre el mecanismo de reflexión ("Extended Reflection" o "Extended Type System"), directamente a las características del objeto en el pipelining.

El siguiente ejemplo, "Get-Process" crea un objeto .NET de la clase "System.Diagnostics.Process" para los procesos activos en el pipelining.
Un cmdlet pueden utilizar cualquier objeto .NET en el pipelining, así como números y cadenas de caracteres, ya que .NET no hace diferenciación entre tipos de datos elementales y clases. En sentido general, poner una cadena de caracteres en un pipelining en WPS será una excepción, dado que el acceso tipificado a objetos es más consistente que la utilización de expresiones regulares. La orientación a objeto es más visible cuado se utilicen números en lugar de cadenas de caracteres como atributos. "WorkingSet64" es un valor numérico de 64 bits, el cual representa el espacio de memoria utilizado por un proceso determinado. El siguiente comando, brinda los procesos que requieran más de 20MB:

Get-Process | Where-Object {$_WorkingSet64 gt 20*1024*1024 }

En lugar de "20*1024*1024" es posible utilizar "20MB". Además, es posible sustituir "Where-Object" por el signo de interrogación "?". La variante recortada seria

ps | ¿ {$_.ws –gt 20MB }

Si se utiliza un solo cmdlet, los resultados se devolverán en la pantalla del ordenador. También, cuando se concatene varios cmdlets en un pipelining, se devolverá el resultado del último cmdlet en la pantalla del ordenador. Cuando el último cmdlet no ofrezca dato alguno, no se registrará nada en la pantalla.

Los objetos pipelining, no solo tienen atributos (propertis), sino también métodos (methods). En un pipelining, el administrador puede llamar el método de un objeto.
Objetos del tipo "System.Diagnistics.Process" tiene, por ejemplo, el método "Kill()". En WPS, este método está encapsulado en el método "Stop-Process".
El siguiente comando termina todas las instancias del "Internet Explorer" en el sistema local con la captura de todas las instancias de procesos de "Get-Process" por "Stop-Process"

Get-Process iexplore | Stop-Process

Los pipelining pueden transportar cualquier tipo de información, incluso, datos elementales. Algunos cmdlets apoyan la lectura de parámetros en los pipelining. El siguiente pipelining lista los servicios de Windows que comineasen con la letra "i":

"i*" | Get-Service

En sentido general, es posible utilizar en WPS comandos clásicos de la línea de comandos. Cuando se ejecute comandos, como "netstat.exe" o "ping.exe", estos depositan cadenas de caracteres en el pipelining (cada línea es una cadena de caracteres).
Estas cadenas de caracteres se prestan perfectamente para ser valoradas por el cmdlet "Select-String". "Select-String" transfiere solo aquellas líneas al pipelining que cumplan las características expresadas en la expresión regular.
En el siguiente ejemplo "netstat.exe" devolverá solo aquellas líneas que una "E" (mayúscula) este seguida de dos cifras

netstat | select-string "E\d\d" –case

PowerSchell Pipeline Processor se encarga de la entrega de objetos .NET a un cmdlet. Los cmdlets mismos no se ocupan del traspaso de objetos o la valoración de los parámetros.

Los pipeline puede tener cualquier largo, por esto no existe limitación a la cantidad de comandos contenidos en un pipeline. Ejemplo:

Get-ChildItem c:\datos –r –filter *.doc
| Where-Object { $_.Length –gt 40000
| Select-Object Name, Length
| Sort-Object Length
| Format-List

"Get-ChildItem" determina los archivos de Microsoft-Word en el directorio y sus subdirectorios "c:\Datos".
El cmdlet "Where-Object" limita los resultados a los objetos, los cuales su atributo "Length" mayor que 40000.
"Select-Object" limita los atributos a partir de "Name" y "Length".
Con el último cmdlet se generará un listado.

Ha de tenerse en cuenta el orden de sucesión de los comandos.
En el comando anterior, el sorteado no puede posicionarse tras el formateado, dado que tras el formateado existe un objeto, el cual representa una corriente de textos.
"Where-Object" y "Sort-Object" pueden intercambiarse, pero para una utilización óptima de los recursos, debería ordenarse la lista reducida de elementos.

Un cmdlet puede acceder a todos los atributos y métodos de un objeto .NET que un cmdlet anterior haya depositado en el pipeline. Los integrantes de un objeto pueden referenciarse a través de los parámetros del cmdlet en el pipeline (por ejemplo en "Sort-Object Length") o a través de la referencia explicita al objeto pipeline actual ($) en un bucle o condición (por ejemplo "Where-Object { $_.Length –gt 40000 }").

No todos los aglutinamientos de cmdlets tienen sentido.
Algunos no son permitidos. Un cmdlet puede exigir un determinado objeto. Lo mejor es utilizar cmdlets que admitan cualquier tipo de objetos.

En el trabajo con WPS, es un reto dar respuesta a las siguientes preguntas:
- ¿Que tipo de objetos trae consigo un cmdlet en un pipeline?
- ¿Que atributos y métodos tienen esos objetos?

En la documentación del usuario de WPS no están contenidos los atributos y métodos de los objetos resultantes. Estos pueden encontrarse solo en la documentación MSDN del .NET Framework.
El siguientes cmdlets brindan ayuda para encontrar información sobre lo que hay en el pipeline: "Get-Member"
Este cmdlet (alias "gm") muestra el nombre de la clase .NET para los objetos en el pipeline, así como los atributos y métodos de la clase.
A partir de la información que brinda "Get-Process | Get-Member" las clases .NET tiene seis miembros:
- Method (métodos)
- Property (atributos)
- PropertySet (serie de atributos)
- NoteProperty (apuntes de atributos)
- ScriptProperty (atributos de script)
- CodeProperty (atributos de código)
- AliasProperty (atributos de alias)

Los resultados de "Get-Member" pueden ser abreviados con la limitación de los mismos a un determinado miembro. Esto se alcanza con el parámetro "–Membertype" (abreviado: "-m"). El comando siguiente lista solo los atributos:

Get-Process | Get-Member –Membertype Properties

Además, es posible filtrar los nombres:

Get-Process | Get-Member *set*

El comando anterior lista los miembros de la clase "Process", cuyo nombre contenga "set".

Independientemente, "method" y "property" son los únicos miembros reales de la clase .NET. El resto son adicionales, los cuales son incorporados por ETS (Extended Type System) a los objetos .NET.

previo
Imprimir!
Ultima actualisación: Tue, 24 ▪ May ▪ 2011
próximo