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


Answers:


82

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

PS> Get-Service

将与以下相同:

PS> Get-Service | Write-Output

16
Powershell以这种方式是如此令人困惑。值得阅读此链接以了解Powershell中提到的pipline,以及如何从函数返回值。“ PowerShell中的return关键字具有误导性-老实说,我避免使用它,因为它根本不像大多数编程语言一样起作用。” - powershell.org/forums/topic/...
吉姆·阿霍

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

27

写输出将输出发送到管道。从那里可以将其通过管道传递到另一个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                                                  

如果您不通过将其分配给变量或通过管道将其传递给anoher命令来告诉Powershell对管道的输出该怎么做,那么它将被发送到out-default,通常是控制台,因此最终结果看起来是相同的。


9

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

write-host取决于主机。在控制台write-host上基本上是在做[console]::WriteLine。请参阅以获取更多信息。


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

5

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

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

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

并且Write-Host被认为是有害的。您可以在“认为写入主机有害”中看到详细说明。


2
我发现写输出有害得多。您如何确定函数实际上返回了预期的结果,而不是从命令中返回了一些意外的垃圾输出?
MKesper '16

6
我认为Write-Output,如果您自己运行脚本,则会在屏幕上显示该消息。因此,我不确定“ Write-Output将消息写入日志,但它不会在屏幕上显示”是什么意思。?
Jim Aho

如果在将输出捕获到变量的函数中使用了Write-Output返回信息,则无法将其返回到屏幕。甚至可能破坏输出。写主机更适合于此。
galmok

@Summer Write-Output很有害,Write-Information很棒。写输出是具有返回值的Powershell函数的敌人。
Brain2000 '19

根据文档,“从Windows PowerShell 5.0开始,Write-Host是Write-Information的包装器,这使您可以使用Write-Host将输出发送到信息流。”
Phistrom

0

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

写主机“ msgtxt” | Get-Service在上面运行时,您将获得输出为“ msgtxt”

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.