我是PowerShell的新手,在做一些代码时,我遇到了这个问题。
当我使用Write-Output
和PS> 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
答案 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-Host
和Write-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)