PowerShell与Write-Host和Write-Output之间的区别?

dan*_*mad 70 windows powershell

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

喜欢...

Write-Host "Hello World ";

Write-Output "Hello World";
Run Code Online (Sandbox Code Playgroud)

Sha*_*evy 60

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

PS> Get-Service
Run Code Online (Sandbox Code Playgroud)

会是这样的:

PS> Get-Service | Write-Output
Run Code Online (Sandbox Code Playgroud)

  • Powershell以这种方式令人困惑.值得阅读此链接以了解powershell中提到的pipline,以及如何从函数返回值."PowerShell中的return关键字具有误导性 - 老实说,我避免使用它,因为它根本不像大多数编程语言那样起作用." - https://powershell.org/forums/topic/function-returning-object-intead-of-value/ (13认同)
  • 如果您正在调用具有返回值的函数,请勿在该函数中使用 Write-Output,否则将返回该字符串而不是您的返回值。这可能会造成各种破坏。 (2认同)

mjo*_*nor 20

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

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

Get-Variable a,b
Run Code Online (Sandbox Code Playgroud)

输出:

Testing Write-Host

Name                           Value                                                                 
----                           -----                                                                 
a                              Testing Write-OutPut                                                  
b                                                  
Run Code Online (Sandbox Code Playgroud)

如果你没有告诉Powershell如何处理输出到管道的输出,通过将它分配给变量或将它输送到anoher命令,那么它会被发送到out-default,这通常是控制台,所以最终结果看起来是一样的.


Cha*_*sch 7

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

write-host是依赖主机的.在控制台write-host中基本上是这样做的[console]::WriteLine.有关详细信息,请参阅此

  • 只是为了给未来的读者澄清一下.`Write-Ouput`发送对象.这次它是一个字符串,但一般来说它会发送对象,通常不需要使用,因为它是输出结果/数据的默认方式:) (4认同)

小智 5

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

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

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

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

  • 我发现写输出更有害。您如何确保函数实际返回您的预期结果,而不是来自命令的一些意外的垃圾输出? (3认同)
  • 如果您自己运行脚本,我认为`Write-Output`会在屏幕上显示消息。因此,我不确定“ Write-Output将消息写入日志,但它不会在屏幕上显示”的含义。? (3认同)
  • [根据文档](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-information?view=powershell-5.1#description),“在 Windows PowerShell 5.0 中启动, Write-Host 是 Write-Information 的包装器,这允许您使用 Write-Host 将输出发送到信息流。” (3认同)

小智 5

Write-Host关于vs 的另一件事是Write-Output:内联字符串连接可能无法按预期工作。

$sampleText = "World"    
Write-Host "Hello" $sampleText
Run Code Online (Sandbox Code Playgroud)

回报

Hello World
Run Code Online (Sandbox Code Playgroud)

但

$sampleText = "World"    
Write-Output "Hello" $sampleText
Run Code Online (Sandbox Code Playgroud)

回报

Hello
World
Run Code Online (Sandbox Code Playgroud)

这将鼓励Write-Output使用变量(并使用串联)一次保存整个字符串。

$hw = "Hello " + $sampleText
Write-Output $hw
Run Code Online (Sandbox Code Playgroud)

  • 不过,前两个片段都不是(明确的)连接字符串。在这两种情况下,cmdlet 都会传递两个单独的参数,但区别在于它们对它们的处理方式:不带 -NoNewLine 的 `Write-Host` 必须写入一行输出,因此最终会附加其输入,而 `Write -Output` 只是输出它的两个输入对象,它们自然地呈现在单独的行上。不过,您不需要单独的变量来组合这两个字符串,只需将它们作为一个参数传递:`Write-Output ("Hello " + $sampleText)` 或 `Write-Output "Hello $sampleText"` 。 (2认同)