写主机和写输出之间的 PowerShell 差异? ?

在 PowerShell 中,写主机写-输出有什么不同?

比如..。

Write-Host "Hello World";


Write-Output "Hello World";
125757 次浏览

简而言之,Write-Host写入控制台本身。把它想象成 VBScript中的 MsgBox。另一方面,Write-Output写入管道,因此下一个命令可以接受它作为其输入。您不需要使用 Write-Output来编写对象,因为 Write-Output是为您隐式调用的。

PS> Get-Service

等同于:

PS> Get-Service | Write-Output

Write-Output通过管道将数据作为对象发送。

Write-Host是依赖于主机的。在控制台中,Write-Host实际上是在做 [console]::WriteLine。 有关更多信息,请参见 这个

Write-Output 将输出发送到管道。从那里,它可以通过管道传输到另一个 cmdlet 或分配给一个变量。 Write-Host 直接发送到控制台。

$a = 'Testing Write-OutPut'  | Write-Output
$b = 'Testing Write-Host' | Write-Host


Get-Variable a,b

产出:

Testing Write-Host


Name                           Value
----                           -----
a                              Testing Write-OutPut
b

如果您没有通过将输出赋值给变量或将其传送给另一个命令来告诉 Powershell 如何处理管道的输出,那么它将被发送到 out-default,这通常是控制台,因此最终结果看起来是相同的。

写主机和写输出的另一个区别是:

  • Write-Host 在屏幕上显示消息,但不将其写入日志

  • Write-Output 将消息写入日志,但不在屏幕上显示。

写主机被认为是有害的。您可以在 返回文章页面写主机被认为是有害的译者:中看到详细的解释。

你可以通过下面的例子来理解这两种 cmds 之间的区别:

Write-host "msgtxt" | Get-Service

在上面运行时,您将得到输出为“ msgtxt”

Write-output "msgtxt" | Get-Service

在上面运行时,您将收到一个错误,因为 msgtxt 不是任何服务的名称。(在理想情况下)(因为您将它写入管道,并将其作为输入传递给 Get-Service)

关于 Write-HostWrite-Output的另一个问题是: 内嵌式字符串串联可能不会像预期的那样工作。

$sampleText = "World"
Write-Host "Hello" $sampleText

报税表

Hello World

但是

$sampleText = "World"
Write-Output "Hello" $sampleText

报税表

Hello
World

这将鼓励 Write-Output使用一个变量(并使用连接)同时保存整个字符串。

$hw = "Hello " + $sampleText
Write-Output $hw