Redirección de la salida

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 PowerShell.

En segundo lugar, estos cmdlets usan el verbo Out de PowerShell porque envían información fuera de Windows PowerShell a alguna otra ubicación.

Salida de consola

De manera predeterminada, 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 pantalla de la ventana de host se encuentra fuera de PowerShell. Esto es importante porque los datos se eliminan realmente cuando se envían fuera de 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

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 se obtienen resultados:

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 PowerShell no reconoce Is-NotACommand:

PS> Get-Command Is-NotACommand | Out-Null
Get-Command : 'Is-NotACommand' isn't recognized as a cmdlet, function, operable program, or script file.
At line:1 char:12
+ Get-Command  <<<< Is-NotACommand | Out-Null

Impresión de datos

Out-Printer solo está disponible en plataformas Windows.

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'

Guardado de datos

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.

En Windows PowerShell 5.1, el cmdlet Out-File crea un archivo Unicode. Algunas herramientas, que esperan archivos ASCII, no funcionan 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, en la mayoría de las circunstancias, la salida se trunque igual que en una ventana de la consola. 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.