Redirigir datos con cmdlets Out-*
Windows PowerShell ofrece varios cmdlets que permiten controlar la salida de datos directamente. Estos cmdlets comparten dos características importantes.
En primer lugar, suelen transformar datos a algún formato de texto. Lo hacen para aplicar la salida de datos a componentes del sistema que la entrada de texto. Esto significa que deben representar los objetos como texto. Por lo tanto, el texto tiene el formato que puede ver en la ventana de la consola de Windows PowerShell.
En segundo lugar, estos cmdlets usan el verbo de Windows PowerShell Out porque envían información fuera de Windows PowerShell a alguna otra ubicación.
Salida de la consola (Out-Host)
De manera predeterminada, Windows PowerShell envía datos a la ventana de host, que es exactamente lo que hace el cmdlet Out-Host. El uso principal del cmdlet Out-Host es la paginación. Por ejemplo, el comando siguiente usa Out-Host para paginar la salida del cmdlet Get-Command:
Get-Command | Out-Host -Paging
La presentación de la ventana de host se encuentra fuera de Windows PowerShell. Esto es importante porque los datos se eliminan realmente cuando se envían fuera de Windows PowerShell. Puede verlo si intenta crear una canalización que pagine los datos en la ventana host y, luego, intenta formatearla como una lista, tal como se muestra aquí:
Get-Process | Out-Host -Paging | Format-List
Es de esperar que el comando muestre páginas de información de proceso en formato de lista. En su lugar, muestra la lista tabular predeterminada:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
101 5 1076 3316 32 0.05 2888 alg
...
618 18 39348 51108 143 211.20 740 explorer
257 8 9752 16828 79 3.02 2560 explorer
...
<SPACE> next page; <CR> next line; Q quit
...
El cmdlet Out-Host envía los datos directamente a la consola, de modo que el comando Format-List nunca recibe nada a lo que aplicar formato.
La forma correcta de estructurar este comando es colocar el cmdlet Out-Host al final de la canalización, como se muestra a continuación. Esto hace que los datos de proceso se formateen en una lista antes de paginarse y mostrarse.
Get-Process | Format-List | Out-Host -Paging
Id : 2888
Handles : 101
CPU : 0.046875
Name : alg
...
Id : 740
Handles : 612
CPU : 211.703125
Name : explorer
Id : 2560
Handles : 257
CPU : 3.015625
Name : explorer
...
<SPACE> next page; <CR> next line; Q quit
...
Esto se aplica a todos los cmdlets Out. Un cmdlet Out siempre debe aparecer al final de la canalización.
Nota
Todos los cmdlets Out representan la salida como texto, con el formato vigente para la ventana de consola, incluidos los límites de longitud de línea.
Descartar la salida (Out-Null)
El cmdlet Out-Null está diseñado para descartar de inmediato cualquier entrada que reciba. Esto es útil para descartar los datos innecesarios que obtiene como efecto secundario de la ejecución de un comando. Si escribe el comando siguiente, no obtiene nada del comando:
Get-Command | Out-Null
El cmdlet Out-Null no descarta una salida de error. Por ejemplo, si escribe el comando siguiente, se muestra un mensaje que le informa de que Windows PowerShell no reconoce 'Is-NotACommand':
PS> Get-Command Is-NotACommand | Out-Null
Get-Command : 'Is-NotACommand' is not recognized as a cmdlet, function, operable program, or script file.
At line:1 char:12
+ Get-Command <<<< Is-NotACommand | Out-Null
Imprimir datos (Out-Printer)
Puede imprimir datos mediante el cmdlet Out-Printer. Si no se proporciona un nombre de impresora, el cmdlet Out-Printer usa la impresora predeterminada. Puede usar cualquier impresora basada en Windows especificando su nombre para mostrar. No se requiere ningún tipo de asignación de puerto de impresora ni una impresora física real. Por ejemplo, si tiene las herramientas de creación de imágenes de documentos de Microsoft Office instaladas, puede enviar los datos a un archivo de imagen. Para ello, escriba:
Get-Command Get-Command | Out-Printer -Name 'Microsoft Office Document Image Writer'
Guardar datos (Out-File)
Puede enviar la salida a un archivo en lugar de a la ventana de la consola mediante el cmdlet Out-File. La línea de comandos siguiente envía una lista de procesos al archivo C:\temp\processlist.txt:
Get-Process | Out-File -FilePath C:\temp\processlist.txt
Los resultados del uso del cmdlet Out-File pueden no ser los esperados si se está acostumbrado al redireccionamiento de salida tradicional. Para entender su comportamiento, se debe tener en cuenta el contexto en el que opera el cmdlet Out-File.
De manera predeterminada, el cmdlet Out-File crea un archivo Unicode. Es el mejor valor predeterminado a largo plazo, pero significa que las herramientas que esperan archivos ASCII no funcionarán correctamente con el formato de salida predeterminado. Puede cambiar el formato de salida predeterminado a ASCII mediante el parámetro Encoding:
Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII
Out-file aplica formato al contenido del archivo para que se parezca a la salida de la consola. Esto hace que la salida se trunque igual que en una ventana de la consola en la mayoría de las circunstancias. Por ejemplo, si ejecuta el siguiente comando:
Get-Command | Out-File -FilePath c:\temp\output.txt
El resultado tendrá un aspecto similar al siguiente:
CommandType Name Definition
----------- ---- ----------
Cmdlet Add-Content Add-Content [-Path] <String[...
Cmdlet Add-History Add-History [[-InputObject] ...
...
Para obtener una salida que no fuerce ajustes de línea para coincidir con el ancho de pantalla, puede usar el parámetro Width para especificar el ancho de línea. Dado que Width es un parámetro entero de 32 bits, el valor máximo que puede tener es 2147483647. Escriba lo siguiente para establecer el ancho de línea en este valor máximo:
Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647
El cmdlet Out-File resulta especialmente útil cuando se quiere guardar la salida tal como se ha mostrado en la consola. Para un mayor control sobre el formato de salida, necesita herramientas más avanzadas. Las veremos en el próximo capítulo, junto con algunos detalles sobre la manipulación de objetos.