
我正在編寫一個 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 將首先收集所有結果,然後再設定所有元素的最大寬度。您可以優化輸出,但結果將不再即時輸出: