PowerShell Write-Host não síncrono

PowerShell Write-Host não síncrono

Estou escrevendo um script do PowerShell para verificar algumas propriedades de um servidor. Quando executo os seguintes cmdletsem ordem, a saída não será exibida na ordem esperada.

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

Saída:

=== Sistema operacional ===

Padrão do Microsoft Windows Server 2012

=== Arquivo de paginação ===

=== Localidade ===

Legenda do nome MaximumSize
----------- ---- -------
4000 C:\pagefile.sys C:\ 'pagefile.sys'

0813

Como é que a saída do arquivo de paginação não é exibida sob o título? Parece-me que Get-WmiObjectestá rodando de forma assíncrona e escreve imediatamente o próximo título (Locale).

Como posso evitar isso? Funciona ao usar Write-Output, mas não consigo usar texto colorido.

Responder1

Parte do seu texto na tela vem de objetos que passam peloGasoduto PowerShell, e alguns vêm dos Write-Hostquais são impressos na tela imediatamente, sem tocar no pipeline.

A coleta de informações WMI sobre o arquivo de paginação leva tempo e gera saídas para o pipeline, mas o script já passou para a impressão da mensagem Locale antes da conclusão do pipeline.

Isso não acontece com (Sistema Operacional), pois esse pipeline termina com ft -AutoSize(Format-Table), que pausa o script e aguarda tudo no pipeline para ter o máximo de informações possível na hora de decidir como dimensionar as colunas. Depois de ftimpresso na tela, o script passa para a mensagem PageFile.

Em vez disso, você deve usar Write-Outputpara enviar o texto pelo pipeline, dessa forma ele se integrará bem com outros recursos do PowerShell, como redirecionamento, coleta de saída de comando em arquivos e variáveis.

Jeffrey Snover (arquiteto-chefe do PowerShell) escreveu sobre por que Write-Hostnão é recomendado em seu blog aqui:http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

Aqui está um link que descreve o comportamento de Format-Table:

Otimizando a largura da coluna

Como os processos de pipeline resultam em tempo real, o PowerShell não pode saber a extensão do espaço que os elementos da coluna ocuparão. Como resultado, tenderá a ser generoso no dimensionamento de colunas. Se você especificar o parâmetro -AutoSize, Format-Table coletará todos os resultados primeiro, antes de definir a largura máxima para todos os elementos. Você pode otimizar a saída, mas os resultados não serão mais exibidos em tempo real:

Mestre-PowerShell | Com Dr. Tobias Weltner

informação relacionada