La canalización es uno de los puntos más importantes y es esencial entender su funcionamiento.
Entendemos la canalización el proceso por el que la salida de un comando es redirigida como entrada de otro comando, y podemos enlazar varios comandos de la forma que queramos y necesitemos.
Los principales puntos para entender la canalización son los siguientes:
- Los cmdlets trabajan siempre con objetos.
- Los objetos de salida pasan a ser los objetos de entrada del siguiente cmdlet
- Los objetos pueden modificarse durante una canalización
- El resultado final muestra los objetos y propiedades que han dado como resultado la ejecución de los distintos cmdlets
- Puede que el resultado final sea vacío ya que durante el procesado no han generado ningún objeto final
- El resultado final lo vemos como un texto, pero en realidad es la representación en modo texto de un objeto.
- El resultado final puede representar de forma parcial el resultado completo, ya que la representación en modo texto de un objeto puede variar según la realicemos.
Como en otros lenguajes la canalización se realiza mediante el carácter |, que es lo que separa unos comandos de otros.
Vamos a ver un ejemplo paso a paso.
1 |
Get-Service |
Esto nos da como resultado el conjunto formado por todos los servicios Windows de la máquina. Lo que vemos por pantalla es la representación en modo texto de esos objetos.
Ahora vamos a filtrar esos objetos, seleccionando solo aquellos cuyo estado sea igual a “running”
1 |
Get-Service | Where-Object {$_.Status -eq "Running"} |
El resultado es similar al comando anterior pero ahora en lugar de tener 152 servicios tenemos 60. Lo que ha pasado es que los 152 objetos que representan a los servicios obtenidos por Get-Service, se han quedado en 60 tras seleccionar únicamente aquellos cuya propiedad Status es igual a Running.
El siguiente paso es que ese resultado que hemos obtenido lo queremos ordenado de otra forma. Entonces ejecutamos
1 |
Get-Service | Where-Object {$_.Status -eq "Running"} | Sort-Object -Property DisplayName |
Ahora lo que hemos hecho es pasar el resultado del conjunto de objetos al comando Sort-Object que los ordena alfabéticamente basándose en la propiedad Displayname. Vemos que la salida del comando no ha cambiado mucho.
Vamos a dar otro paso
1 |
Get-Service | Where-Object {$_.Status -eq "Running"} | Sort-Object -Property DisplayName | Select-Object -Property Displayname, Name, ServcesDependedOn -First 10 |
Ahora vemos que la salida en pantalla a variado ligeramente. Hemos redirigido la salida anterior al comando Select-Object que nos permite seleccionar que propiedades de cada objeto servicio queremos mostrar, en este caso, las propiedades Displayname, Name y ServicesDependedOn. Esta última propiedad no la estábamos viendo en los comandos anteriores ya que en la representación a texto por defecto de los servicios no está incluida, pero siempre ha estado disponible en el resultado final. Con la opción -Firs 10, lo que indicamos es que sólo queremos los 10 primeros objetos del resultado.
Por último, en lugar de sacar el resultado por pantalla lo vamos a exportar a un archivo en formato CSV.
1 |
Get-Service | Where-Object {$_.Status -eq "Running"} | Sort-Object -Property DisplayName | Select-Object -Property Displayname, Name, ServcesDependedOn -First 10 | Export-CSV servicios.csv |
Vemos que ahora no hemos obtenido ningún resultado por pantalla, lo que obtenemos es una archivo con la representación de los objetos que han quedado al final de toda la canalización de los objetos por los distintos cmdlets.
Comandos básicos de salida en pantalla
Por defecto el resultado final de un comando se muestra por pantalla representándolo en modo texto, pero tenemos algunas opciones para cambiar ese comportamiento.
Tenemos los cmdlets con verbo Write y Out:
- Write-Host, Write-Output, Write-Verbose, Write-Error, Write-Warning…
- Out-Default, Out-File, Out-GridView…
Normalmente se suele utilizar Write-Host y Write-Ouput para sacar por pantalla alguna información. Pero hay una gran diferencia, Write-Host escribe directamente en pantalla el resultado, mientras que Write-Output genera como salida un objeto (o varios) que puede ser canalizado a otros comandos.
Veamos un ejemplo:
1 2 3 |
Write-Host "Negu" Write-Output "Negu" |
Vemos que el resultado es el mismo. Ambos generan un texto en la pantalla. Ahora veamos la diferencia:
1 2 3 |
Write-Host "Negu" | Get-Member Write-Output "Negu" | Get-Member |
Vemos que Write-Output genera un objeto de tipo String, mientras que Write-Host no genera ningún objeto como resultado
Los cmdlets Out-XXX son muy sencillos ya que redirigen la salida tal y como se indica en el comando:
- Out-Default: redirige a la salida por defecto
- Out-File: redirige a un archivo
- Out-GridView: abre una ventana en forma de tabla
- Out-Printer: lo redirige a la impresora por defecto
Ejemplo:
Como cmdlet especial tenemos Tee-Object, que nos permite obtener el resultado a través de dos salidas, por ejemplo a un fichero y por pantalla o a una variable y por pantalla.
Temas
- Introducción
- Instalación y requerimientos
- Ayuda
- Ampliando la funcionalidad
- Canalización
- Operadores
- Comandos básicos
- Formato de salida
- Importar y Exportar datos
- Arrays y HashTables
- Ejecución de Scripts
- Providers
- Trabajos
- Scripts y funciones
- Gestión de Errores
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?
Qué diferencia hay entre Export, out-file
También quisiera saber para que sirve los otros comandos de objetos cómo:
Compare-object
foreach-object
group-object
measure-object
new-object
muchas gracias, el curso es muy fácil de comprender todo un mago