PowerShell 寫入主機不同步

PowerShell 寫入主機不同步

我正在編寫一個 PowerShell 腳本來檢查伺服器的某些屬性。當我執行以下 cmdlet 時為了,輸出未按我期望的順序顯示。

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

輸出:

===作業系統===

微軟 Windows Server 2012 標準版

=== 頁面檔案 ===

=== 語言環境 ===

最大大小 名稱說明
----------- ---- ----------
4000 C:\pagefile.sys C:\ 'pagefile.sys'

0813

頁面檔案輸出為何不顯示在其標題下?在我看來,它Get-WmiObject是異步運行的,並立即寫入下一個標題(區域設定)。

我怎樣才能防止這種情況發生?它在使用寫入輸出時有效,但隨後我無法使用彩色文字。

答案1

螢幕上的一些文字來自穿過物體的物體PowerShell管道,還有一些來自Write-Host立即列印到螢幕而不接觸管道。

收集有關頁面文件的 WMI 資訊需要花費一些時間並將其輸出到管道,但在該管道完成之前,腳本已經開始列印區域設定訊息。

對於(作業系統),這種情況不會發生,因為該管道以ft -AutoSize(格式表)結束,它會暫停腳本並等待管道中的所有內容,以便在決定如何調整列大小時擁有盡可能多的信息。一旦ft列印到螢幕上,腳本就會移動到頁面檔案訊息。

您應該使用Write-Output透過管道發送文本,這樣它將與其他 PowerShell 功能(例如重定向、收集文件和變數中的命令輸出)很好地整合。

Jeffrey Snover(PowerShell 首席架構師)在他的部落格上寫了關於為什麼Write-Host不推薦的原因:http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

這是描述 行為的連結Format-Table

優化列寬

由於管道即時處理結果,PowerShell 無法知道列元素將佔用多寬的空間。因此,它在調整列大小時往往會比較慷慨。如果指定 -AutoSize 參數,Format-Table 將首先收集所有結果,然後再設定所有元素的最大寬度。您可以優化輸出,但結果將不再即時輸出:

大師-PowerShell |與托比亞斯·韋爾特納博士一起

相關內容