【问题标题】:What is the difference in result by write-host and write-output?写入主机和写入输出的结果有什么区别?
【发布时间】:2016-08-19 08:21:47
【问题描述】:

我是 PowerShell 的新手,在编写一些代码时,我遇到了这个问题。 当我使用Write-HostWrite-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

【问题讨论】:

    标签: powershell write-host


    【解决方案1】:

    重要区别

    Write-output 将一个对象写入管道,因此下一个命令可以接受它作为输入。 而 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 指定一个对象...

    【讨论】:

      【解决方案2】:

      以下是进行谷歌搜索时的两个顶级结果:

      PowerShell difference between Write-Host and Write-Output?

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

      *编辑: Write-Host 不支持 $PSVersionTable 的数据类型,而 Write-Output 支持。看看哪个支持你可以使用的数据类型

      Get-Help Write-Host
      Get-Help Write-Output
      

      【讨论】:

      • Eric 我已经检查过这些。请检查我随问题上传的图片。无论如何,谢谢?
      • 啊,我没看图,我现在已经在我的答案中添加了几行。
      • Quib​​ble:不是Write-Host支持 [System.Management.Automation.PSVersionHashTable]$PSVersionTable的数据类型;它只是以一种对人类观察者没有帮助的方式将其字符串化,主要是因为它通常用于打印 stringsWrite-HostWrite-Output 都支持(接受)any 类型的实例,但是(a)它们对它们进行字符串化的方式不同,并且(b) - 更重要的是 - Write-Output 和 @ 987654333@ 有不同的用途(正如链接文章所解释的,但不是你的答案本身)。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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


        解释控制台输出的区别

        • Write-Output,就像隐式输出一样,使用 PowerShell 的 default output formatting,它通常提供比仅调用 @ 更更友好的表示 987654334@ 在底层 .NET 类型实例上 - 请参阅 Get-Help about_Format.ps1xml

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

          • [System.Management.Automation.PSVersionHashTable] 实例上调用.ToString() 只会产生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)
        

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

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

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

          1 2
          

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-18
          • 2011-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多