write-host和write-output的结果有什么不同?

时间:2016-08-19 08:21:47

标签: powershell write-host

我是PowerShell的新手,在做一些代码时,我遇到了这个问题。 当我使用Write-OutputPS> Write-Output $PSVersionTable Name Value ---- ----- PSVersion 5.0.10586.117 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} BuildVersion 10.0.10586.117 CLRVersion 4.0.30319.17929 WSManStackVersion 3.0 PSRemotingProtocolVersion 2.3 SerializationVersion 1.1.0.1 执行相同的查询时,我会得到不同的结果:

PS> Write-Host $PSVersionTable                                                                                                                   
System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry

VS

document.getElementByTagName

4 个答案:

答案 0 :(得分:1)

以下是进行Google搜索时的两个最佳结果:

PowerShell difference between Write-Host and Write-Output?

Which should I use: "Write-Host", "Write-Output", or "[console]::WriteLine"?

*编辑: Write-Host不支持$PSVersionTable的{​​{1}}数据类型。要查看哪一个支持您可以使用哪种数据类型

Write-Output

答案 1 :(得分:1)

重要区别

写入输出将对象写入管道,因此下一个命令可以接受它作为输入。 Write-host只是直接写入控制台。

在您的示例中

Write-Output会将对象写入管道,Out-Default(管道末尾隐藏)将在表或列表中显示对象值。

Write-Host直接写入控制台,而不是在管道末尾使用默认cmdlet Out-default。换句话说,Write-Host不会向管道写入任何内容,只显示他在控制台上看到的内容。 这就是为什么您可以将-foregroundcolor等参数添加到Write-Host cmdlet,而不是写入输出cmdlet。

Write-Host 在调试时非常有用,您需要以不同的颜色显示文本。

您只需使用

进行测试即可
Write-Output "Hello World" | Get-Member

我们可以认为这是一个System.String对象。

如果我们跑:

Write-Host "Hello World" | Get-Member

我们收到错误消息: gm:您必须为Get-Member cmdlet指定一个对象...

答案 2 :(得分:0)

另一篇好文章: Which Write Is Right For PowerShell?

简而言之,$ PSVersionTable返回哈希表(对象集合)。 Write-host命令试图将所有内容转换为字符串,然后在控制台上显示它,但是您无法将整个哈希表直接转换为字符串。

Write-Output直接将此哈希表发送到控制台,而不尝试更改它。

答案 3 :(得分:0)

听起来你已经知道 Write-HostWrite-Output有不同的目的。简而言之:

  • 生成(数据)输出,只需按原样使用命令或表达隐式将其输出到成功(数据)输出流 - 很少需要明确使用Write-Output

    • 您可以单独使用Write-Output $PSVersionTable而不是$PSVersionTable
  • Write-Host,在PSv4中直接打印到主机 (例如,控制台),绕过PowerShell的输出流,这就是it should generally be avoided的原因。虽然 已经集成到自v5以来的PowerShell的输出流中,但通过 new stream#6 ,它的使用效果更好它的后继者Write-Information - 除非您需要生成彩色控制台输出以创建UI。

解释控制台输出的差异:

  • Write-Output ,就像隐式输出一样,使用PowerShell' default output formatting ,这通常提供了很多友好的表示而不仅仅是在底层的.NET类型实例上调用.ToString() - 请参阅Get-Help about_Format.ps1xml

    • $PSVersionTable.GetType().FullName告诉我们$PSVersionTable[System.Management.Automation.PSVersionHashTable]的一个实例,它派生自[System.Collections.Hashtable],PowerShell的默认格式在2列表格中呈现布局。
  • Write-Host基本上只在其参数上调用.ToString() ,在许多情况下只是打印一个对象的完整类型名称。

    • .ToString()个实例上调用[System.Management.Automation.PSVersionHashTable]只会产生System.Management.Automation.PSVersionHashTable
      但是,Write-Host prints the elements of objects that support the [IEnumerable] interface individually

    • 因此, $PSVersionTable中的每个条目都是单独打印,因为条目属于[System.Collections.DictionaryEntry]类型,它也会字符串化为只需输入类型的全名 - System.Collections.DictionaryEntry - 您就会得到一个以空格分隔的字符串列表(因为Write-Host通常会将不同的输出连接起来,每个字符串都有一个空格。)

请注意,您可以通过Out-String cmdlet显式请求PowerShell的默认输出格式的字符串表示。

因此,除了流集成方面,以下Write-Host命令会生成与Write-Output $PSVersionTable相同的控制台输出(或简单地说:$PSVersionTable) :

Write-Host ($PSVersionTable | Out-String)