PowerShell Write-Host no es sincrónico

PowerShell Write-Host no es sincrónico

Estoy escribiendo un script de PowerShell para comprobar algunas propiedades de un servidor. Cuando ejecuto los siguientes cmdletsen orden, el resultado no se muestra en el orden esperado.

Write-Host "=== Operating System ==="
Get-WmiObject -computername $ServerName -class Win32_OperatingSystem | select Caption | ft -HideTableHeaders -AutoSize

Write-Host "=== Pagefile ==="
Get-WmiObject -ComputerName $ServerName -Class Win32_PageFileSetting

Write-Host "=== Locale ==="
Get-WmiObject -ComputerName $ServerName -class Win32_OperatingSystem | select Locale | ft -HideTableHeaders -AutoSize | Write-Output

Producción:

=== Sistema operativo ===

Estándar de Microsoft Windows Server 2012

=== Archivo de paginación ===

=== Configuración regional ===

Título del nombre de tamaño máximo
----------- ---- -------
4000 C:\pagefile.sys C:\ 'pagefile.sys'

0813

¿Cómo es posible que la salida del archivo de paginación no se muestre debajo de su título? Me parece que Get-WmiObjectse ejecuta de forma asincrónica e inmediatamente escribe el siguiente título (Configuración regional).

¿Cómo puedo prevenir esto? Funciona cuando uso Write-Output, pero no puedo usar texto en color.

Respuesta1

Parte del texto en pantalla proviene de objetos que pasan por elCanalización de PowerShell, y algunos provienen de Write-Hostlos cuales se imprimen en la pantalla inmediatamente sin tocar la tubería.

Recopilar información WMI sobre el archivo de paginación lleva tiempo y se envía a la canalización, pero el script ya ha pasado a imprimir el mensaje de configuración regional antes de que finalice la canalización.

Esto no sucede con (Sistema operativo), porque esa canalización termina con ft -AutoSize(Formato-Tabla), que pausa el script y espera todo lo que está en la canalización para tener la mayor cantidad de información posible al decidir cómo dimensionar las columnas. Una vez que ftse imprime en la pantalla, el script pasa al mensaje PageFile.

En su lugar , debe utilizar Write-Outputpara enviar el texto a través de la canalización, de esta manera se integrará bien con otras funciones de PowerShell como la redirección y la recopilación de resultados de comandos en archivos y variables.

Jeffrey Snover (arquitecto principal de PowerShell) ha escrito sobre por qué Write-Hostno se recomienda en su blog aquí:http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

Aquí hay un enlace que describe el comportamiento de Format-Table:

Optimización del ancho de columna

Debido a que los resultados de los procesos de canalización se realizan en tiempo real, PowerShell no puede saber qué espacio ocuparán los elementos de la columna. Como resultado, tenderá a ser generoso en el tamaño de las columnas. Si especifica el parámetro -AutoSize, Format-Table recopilará todos los resultados primero antes de establecer el ancho máximo para todos los elementos. Puede optimizar la salida, pero los resultados ya no se mostrarán en tiempo real:

Maestro-PowerShell | Con el Dr. Tobías Weltner

información relacionada