1

我是 PowerShell 的新手,在做一些代码时,我经历了这件事。当我使用Write-HostandWrite-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
4

4 回答 4

2

重要区别

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

在你的例子中

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

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

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

你可以简单地测试一下

Write-Output "Hello World" | Get-Member

我们可以确定这是一个 System.String 对象。

如果我们运行:

Write-Host "Hello World" | Get-Member

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

于 2016-08-19T16:26:01.977 回答
1

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

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

我应该使用哪个:“Write-Host”、“Write-Output”或“[console]::WriteLine”?

*编辑: Write-Host不支持$PSVersionTablewhile的数据类型Write-Output。查看哪个支持您可以使用的数据类型

Get-Help Write-Host
Get-Help Write-Output
于 2016-08-19T08:28:44.970 回答
0

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

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

    • 而不是Write-Output $PSVersionTable,您可以简单地单独使用$PSVersionTable
  • Write-Host,在 PSv4- 中直接打印到主机(例如,控制台),绕过 PowerShell 的输出流,这就是为什么通常应该避免它。虽然它从 v5 开始通过流 #6集成到 PowerShell 的输出流中,但最好使用它的后继者Write-Information- 除非您需要生成仅限控制台的输出来创建交互式体验,例如编写提示字符串,尤其是如果彩色显示是需要。


解释控制台输出的差异:

  • Write-Output,就像隐式输出一样,使用 PowerShell 的默认输出格式,它通常提供比仅调用底层 .NET 类型实例更友好的表示- 请参阅.ToString()Get-Help about_Format.ps1xml

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

    • 调用实例只会.ToString()产生. 但是,单独打印支持接口的对象的元素[System.Management.Automation.PSVersionHashTable]System.Management.Automation.PSVersionHashTable
      Write-Host[IEnumerable]

    • 因此,in 中的每个条目$PSVersionTable都是单独打印的,并且由于条目是 type [System.Collections.DictionaryEntry],它也只是简单地字符串化为类型的全名System.Collections.DictionaryEntry- 你会得到这些字符串的空格分隔列表(因为Write-Host通常将不同的输出与每个单独的空格连接起来)。

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

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

Write-Host ($PSVersionTable | Out-String)

另一个重要区别是,如果您将多个对象作为参数传递(而不是通过管道):

  • Write-Output单独格式化每个输入对象,就像在管道中一样;例如,Write-Output 1, 2产生行:

    1
    2
    
  • Write-Host打印字符串化输入对象的单个空格分隔列表;例如,Write-Host 1, 2产生一行

    1 2
    

如果您将这些值作为单独的参数(而不是作为数组)传递,这同样适用;也就是说,Write-Output 1 2Write-Host 1 2产生相同的相应输出。

于 2017-08-23T02:07:25.197 回答
0

还有一篇好文章: 哪种写法适合 PowerShell?

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

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

于 2016-08-19T08:40:35.277 回答