Windows PowerShell incluye varios cmdlets que permiten controlar directamente la salida de datos. Estos cmdlets comparten dos características importantes.
En primer lugar, suelen transformar los datos en algún tipo de texto. El motivo es que envían los datos a componentes del sistema que requieren texto como entrada. Esto significa que necesitan representar los objetos como texto. Por tanto, el texto con formato aplicado es el que se muestra en la ventana de la consola de Windows PowerShell.
En segundo lugar, estos cmdlets tienen el verbo Out de Windows PowerShell porque envían información desde Windows PowerShell a cualquier otra ubicación. El cmdlet Out-Host no es una excepción: la presentación de la ventana del host está fuera de Windows PowerShell. Esto es importante, ya que cuando se envían datos fuera de Windows PowerShell, en realidad dichos datos se quitan. Para comprobarlo, cree una canalización que envíe datos divididos en páginas a la ventana del host y, a continuación, intente darles formato de lista, como se muestra a continuación:
PS> Get-Process | Out-Host -Paging | Format-List
Quizá espere que el comando muestre páginas de información de procesos en formato de lista, pero lo que muestra es la lista con formato de tabla 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, por lo que el comando Format-List nunca recibe datos a los 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 se aplique formato de lista a los datos de procesos antes de dividirlos en páginas y mostrarlos.
PS> 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 es aplicable a todos los cmdlets Out. Un cmdlet Out debe aparecer siempre al final de la canalización.
Nota: | |
Todos los cmdlets Out presentan el resultado como texto, utilizando el formato vigente para la ventana de la consola, incluidos los límites de longitud de línea. |
Dividir en páginas el resultado mostrado en la consola (Out-Host)
De forma predeterminada, Windows PowerShell envía datos a la ventana del host, que es exactamente lo que el cmdlet Out-Host realiza. El cmdlet Out-Host se usa principalmente para dividir los datos en páginas, como se ha explicado anteriormente. Por ejemplo, el comando siguiente usa Out-Host para dividir el resultado del cmdlet Get-Command en páginas:
PS> Get-Command | Out-Host -Paging
También puede usar la función more para dividir datos en páginas. En Windows PowerShell, more es una función que llama a Out-Host -Paging. El comando siguiente muestra el uso de la función more para dividir el resultado de Get-Command en páginas:
PS> Get-Command | more
Si incluye uno o más nombres de archivos como argumentos de la función more, esta función leerá los archivos especificados y mostrará su contenido dividido en páginas en el host:
PS> more c:\boot.ini [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] ...
Descartar los resultados (Out-Null)
El cmdlet Out-Null se ha diseñado para descartar inmediatamente cualquier entrada que reciba. Esto resulta útil para descartar datos innecesarios que se obtengan como efecto secundario de ejecutar un comando. Si escribe el siguiente comando, no recibirá nada del comando:
PS> Get-Command | Out-Null
El cmdlet Out-Null no impide que se muestren mensajes de error. Por ejemplo, si escribe el comando siguiente, aparecerá un mensaje para informar 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, operabl e program, or script file. At line:1 char:12 + Get-Command <<<< Is-NotACommand | Out-Null
Imprimir datos (Out-Printer)
Puede imprimir datos usando el cmdlet Out-Printer. El cmdlet Out-Printer usa la impresora predeterminada si no se proporciona un nombre de impresora. Para utilizar cualquier otra impresora basada en Windows, debe especificar su nombre para mostrar. No es necesario asignar ningún tipo de puerto de impresora ni una impresora física real. Por ejemplo, si tiene instaladas las herramientas de creación de imágenes de documentos de Microsoft Office, puede enviar los datos a un archivo de imagen con el siguiente comando:
PS> Get-Command Get-Command | Out-Printer -Name "Microsoft Office Document Image Writer"
Guardar datos (Out-File)
Puede usar el cmdlet Out-File para enviar el resultado a un archivo, en lugar de a la ventana de la consola. La línea de comandos siguiente envía una lista de procesos al archivo C:\temp\processlist.txt:
PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt
El efecto de usar el cmdlet Out-File puede que no sea el esperado si está acostumbrado a la redirección tradicional de los resultados. Para entender este comportamiento, debe tener en cuenta el contexto en el que se utiliza el cmdlet Out-File.
De forma predeterminada, el cmdlet Out-File crea un archivo Unicode. Esta configuración predeterminada es la mejor a la larga, pero significa que las herramientas que esperan archivos ASCII no funcionarán correctamente con el formato predeterminado para los resultados. Puede cambiar este formato predeterminado a ASCII usando el parámetro Encoding:
PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII
El cmdlet Out-file aplica formato al contenido del archivo para que se parezca al resultado de la consola. En la mayoría de los casos, esto hace que el resultado aparezca truncado como en una ventana de consola. Por ejemplo, si ejecuta el siguiente comando:
PS> Get-Command | Out-File -FilePath c:\temp\output.txt
El resultado se parecerá al siguiente:
CommandType Name Definition ----------- ---- ---------- Cmdlet Add-Content Add-Content [-Path] <String[... Cmdlet Add-History Add-History [[-InputObject] ... ...
Si desea que no se realicen ajustes de línea en el resultado para adaptar los datos al ancho de pantalla, puede utilizar el parámetro Width para especificar el ancho de línea. Dado que Width es un parámetro cuyo valor es un entero de 32 bits, el valor máximo que puede tener es 2147483647. Para establecer el ancho de línea en este valor máximo, escriba lo siguiente:
Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647
El cmdlet Out-File es muy útil si se desea guardar el resultado tal como se habría mostrado en la consola. Para tener un mayor control sobre el formato de los resultados se necesitan herramientas más avanzadas. Examinaremos estas herramientas en el siguiente capítulo, junto con información detallada acerca de la manipulación de objetos.