我应该使用哪一个:“Write-Host”,“Write-Output”或“ :: WriteLine”?
我试图去掌握PowerShell。 我正在努力解决的一个简单的事情是,似乎有很多不同的方式来输出消息。 我应该使用哪一个,有什么区别,是否有一个常规的方法呢?
我也注意到,如果我使用:
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