我正在编写一个 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
输出:
=== 操作系统 ===
微软视窗服务器 2012 标准版
=== 页面文件 ===
=== 语言环境 ===
最大大小名称说明
----------- ---- --------
4000 C:\pagefile.sys C:\ 'pagefile.sys'0813
为什么页面文件输出没有显示在其标题下?在我看来,它Get-WmiObject
正在异步运行并立即写入下一个标题(Locale)。
我怎样才能防止这种情况?它在使用 Write-Output 时有效,但是我不能使用彩色文本。
屏幕上的一些文本来自通过PowerShell 管道的对象,而另一些则来自
Write-Host
不接触管道而立即打印到屏幕的对象。收集有关页面文件的 WMI 信息需要时间并输出到管道,但脚本已经在该管道完成之前继续打印区域设置消息。
对于(操作系统)不会发生这种情况,因为该管道以
ft -AutoSize
(Format-Table)结束,它暂停脚本并等待管道中的所有内容,因此在决定如何调整列大小时它拥有尽可能多的信息。一旦ft
打印到屏幕上,脚本就会移动到 PageFile 消息。您应该改用
Write-Output
通过管道发送文本,这样它将与其他 PowerShell 功能(如重定向、收集文件和变量中的命令输出)很好地集成。Jeffrey Snover(PowerShell 首席架构师)在他的博客上写了为什么
Write-Host
不推荐:http: //www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/这是一个描述行为的链接
Format-Table
: