我应该使用哪一个:“Write-Host”,“Write-Output”或“ :: WriteLine”?

我试图去掌握P​​owerShell。 我正在努力解决的一个简单的事情是,似乎有很多不同的方式来输出消息。 我应该使用哪一个,有什么区别,是否有一个常规的方法呢?

我也注意到,如果我使用:

write-host "count=" + $count 

+包含在输出中。 为什么? expression式在写出之前不应该被评估为产生一个串联的string吗?

当您想要在pipe道中发送数据时,应使用Write-Output ,但不一定要在屏幕上显示。 如果没有别的东西首先使用它,pipe道将最终将其写入out-default 。 当你想要做相反的事情时,应该使用Write-Host[console]::WriteLine实际上是Write-Host在后台执行的操作。

运行此演示代码并检查结果。

 function Test-Output { Write-Output "Hello World" } function Test-Output2 { Write-Host "Hello World" -foreground Green } function Receive-Output { process { Write-Host $_ -foreground Yellow } } #Output piped to another function, not displayed in first. Test-Output | Receive-Output #Output not piped to 2nd function, only displayed in first. Test-Output2 | Receive-Output #Pipeline sends to Out-Default at the end. Test-Output 

您需要将括号连接操作放在括号中,以便PowerShell在标记Write-Host的参数列表之前处理并置操作。

 write-host ("count=" + $count) 

顺便说一句 – 观看Jeffrey Snover的这段video ,解释pipe道是如何工作的。 回到开始学习PowerShell时,我发现这是对pipe道工作原理的最有用的解释。

除了安迪提到的之外,还有另一个可能很重要的区别 – 写主机直接写入主机并且什么也不返回,这意味着你不能将输出redirect到一个文件。

 ---- script a.ps1 ---- write-host "hello" 

现在在PowerShell中运行:

 PS> .\a.ps1 > someFile.txt hello PS> type someFile.txt PS> 

如所见,您不能将它们redirect到一个文件中。 对于不小心的人来说,这可能令人惊讶。

但是,如果切换到使用写入输出,您将得到预期的redirect工作。

这是另一种完成Write-Output等效function的方法。 只要把你的string放在引号中:

 "count=$count" 

通过运行这个实验,你可以确保它和Write-Output一样:

 "blah blah" > out.txt Write-Output "blah blah" > out.txt Write-Host "blah blah" > out.txt 

前两个输出“blah blah”out.txt,但第三个不会。

“帮助写入输出”给出了这种行为的暗示:

此cmdlet通常在脚本中用于在控制台上显示string和其他对象。 但是,由于缺省行为是在pipe道末尾显示对象,因此通常不需要使用该cmdlet。

在这种情况下,string本身“count = $ count”是stream水线结束处的对象,并被显示。

从我的testing写输出和[控制台] :: WriteLine()执行比写主机好得多。

根据你需要写出多less文字,这可能是重要的。

下面是5个testing的结果,分别写入主机,写入输出和[Console] :: WriteLine()。

在我有限的经验中,我发现在处理任何types的真实世界的数据时,我需要放弃cmdlet,直接从底层的命令中获得足够好的性能。

 measure-command {$count = 0; while ($count -lt 1000) { Write-Host "hello"; $count++ }} 1312ms 1651ms 1909ms 1685ms 1788ms measure-command { $count = 0; while ($count -lt 1000) { Write-Output "hello"; $count++ }} 97ms 105ms 94ms 105ms 98ms measure-command { $count = 0; while ($count -lt 1000) { [console]::WriteLine("hello"); $count++ }} 158ms 105ms 124ms 99ms 95ms