ChatGPT解决这个技术问题 Extra ChatGPT

写主机和写输出之间的PowerShell区别?

PowerShell 中的 Write-HostWrite-Output 有什么区别?

喜欢...

Write-Host "Hello World";

Write-Output "Hello World";

P
Peter Mortensen

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

PS> Get-Service

将与以下内容相同:

PS> Get-Service | Write-Output

如果您正在调用具有返回值的函数,请不要在该函数中使用 Write-Output,否则将返回该字符串而不是您的返回值。这可能会造成各种破坏。
m
mjolinor

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,这通常是控制台,因此最终结果看起来相同.


k
kame

Write-Output 通过管道将数据作为对象发送。在 Questions 示例中,它只会传递一个字符串。

Write-Host 取决于主机。在控制台中 Write-Host 本质上是在做 [console]::WriteLine。有关详细信息,请参阅 this


只是为了澄清未来的读者。 Write-Ouput 发送对象。这次它是一个字符串,但通常它会发送对象,并且通常不需要使用,因为它是输出结果/数据的默认方式:)
P
Peter Mortensen

Write-Host 和 Write-Output 之间的另一个区别:

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

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

并且 Write-Host 被认为是有害的。您可以在 Write-Host Considered Harmful 中查看详细说明。


我发现 Write-Output 更有害。您如何确保函数实际返回您的预期结果,而不是命令的一些意外垃圾输出?
如果您自己运行脚本,我认为 Write-Output 会在屏幕上显示消息。所以我不确定“Write-Output 将一条消息写入日志,但它没有在屏幕上显示”是什么意思。 ?
如果在将输出捕获到变量的函数中使用它,则不能让 Write-Output 将信息返回到屏幕。它甚至可能破坏输出。 Write-Host 更适合于此。
@Summer Write-Output 是有害的,Write-Information 很棒。写输出是具有返回值的 Powershell 函数的敌人。
According to the docs,“从 Windows PowerShell 5.0 开始,Write-Host 是 Write-Information 的包装器,这允许您使用 Write-Host 将输出发送到信息流。”
G
Greg

您可以通过以下示例了解两个 cmd 之间的区别:

Write-host "msgtxt" | Get-Service

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

Write-output "msgtxt" | Get-Service 

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