2016-08-19 82 views
0

我是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 

回答

1

在這裏做一個谷歌搜索時是兩個頂部的結果:

PowerShell difference between Write-Host and Write-Output?

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

*編輯: Write-Host不支持數據類型$PSVersionTableWrite-Output。看看哪一個支持您可以使用的數據類型

Get-Help Write-Host 
Get-Help Write-Output 
+0

埃裏克我已確定這些。請檢查我上傳的圖片以及問題。 Thnx反正 – Kaushal

+0

啊,我沒有看到圖片,我現在在我的答案中加了幾行。 –

+0

Quibble:不是'Write-Host'不支持'[System.Management.Automation.PSVersionHashTable]','$ PSVersionTable'的數據類型;它只是以一種對人類觀察者無益的方式將其串聯起來,主要是因爲它通常用於打印_strings_; Write-Output「和」Write-Output「都支持(接受)_any_類型的實例,但是(a)它們的字符串化方式不同,(b) - 更重要的是 - **'Write-Output'和'Write-主持人服務的目的非常不同**(正如鏈接文章解釋的那樣,但本身並不是你的答案)。 – mklement0

0

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

總之$ PSVersionTable返回哈希表(對象的集合)。 Write-host命令試圖將所有內容都轉換爲字符串,然後在控制檯顯示它,但不能將整個散列表直接轉換爲字符串。

寫輸出直接發送這個哈希表到控制檯而不嘗試改變它。

1

重要的區別

寫寫輸出對象到管道,從而它的輸入下一個命令可以接受它。 雖然寫主機只是直接寫入控制檯。

在您的例子

寫輸出將對象寫入到管道,和Out-默認(在管道的端部隱藏)將在任一表或列表中顯示的對象的值。

寫主機直接寫入控制檯,而不是在管道末端使用缺省cmdlet Out-default。換句話說,寫主機不會向管道寫入任何內容,只顯示他在控制檯上看到的內容。 這就是爲什麼您可以將參數-foregroundcolor添加到Write-Host cmdlet,而不是寫入輸出小命令。

寫主機在調試時很有用,而且您需要以不同的顏色顯示文本。

你可以簡單地用

Write-Output "Hello World" | Get-Member 

測試,我們可以瑟,這是以System.String對象。

如果我們運行:

Write-Host "Hello World" | Get-Member 

我們得到一個錯誤: 克:您必須指定對象爲獲取會員cmdlet的...

0

這聽起來像你已經知道Write-HostWrite-Output有不同的目的。簡而言之:

  • 爲了產生(數據)輸出,只需使用一個命令或表達式原樣,其隱含其輸出到成功(數據)輸出流 - 明確使用的Write-Output很少需要

    • 相反的Write-Output $PSVersionTable,你可以簡單地通過自身使用$PSVersionTable
  • Write-Host,在PSv4-,直接把主機(例如,控制檯)打印,繞過PowerShell的輸出流,這是爲什麼it should generally be avoided。雖然自從V5集成到PowerShell的輸出流,通過流#6,這是更好地使用它的後繼者,Write-Information - 除非你需要製作彩色控制檯輸出,用於創建用戶界面。


爲了解釋控制檯輸出的區別:就像隱輸出

  • Write-Output使用PowerShell的default output formatting,它通常提供一個更友好的表示不只是撥打.ToString()基礎.NET類型實例 - 見Get-Help about_Format.ps1xml

    • $PSVersionTable.GetType().FullName告訴我們,$PSVersionTable[System.Management.Automation.PSVersionHashTable]一個實例,從[System.Collections.Hashtable],這PowerShell的默認格式呈現在2列的表格佈局派生。
  • 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]類型,這也stringifies簡單類型的全名 - System.Collections.DictionaryEntry - 你得到這些字符串的空格分隔的列表(因爲Write-Host通常會將不同的輸出分別以單個空格連接)。

注意,您可以明確要求PowerShell的默認輸出通過Out-String cmdlet的格式化的字符串表示。

因此,除了從該流的集成方面,以下Write-Host命令產生相同控制檯輸出作爲Write-Output $PSVersionTable(或簡稱:$PSVersionTable):

Write-Host ($PSVersionTable | Out-String) 
相關問題