![PowerShell Write-Host não síncrono](https://rvso.com/image/658747/PowerShell%20Write-Host%20n%C3%A3o%20s%C3%ADncrono.png)
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-WmiObject
está 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-Host
quais 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 ft
impresso na tela, o script passa para a mensagem PageFile.
Em vez disso, você deve usar Write-Output
para 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-Host
nã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: