2013-11-26 101 views
2

下面是一個小的PowerShell腳本。PowerShell寫入主機和寫入輸出到控制檯的不同輸出

function test() { 
    $paramstring = "name=vindhya 
    id=182122" 
    $hash_params = convertfrom-stringdata -stringdata $paramstring 
    Write-Host $hash_params 
    callee $hash_params 
} 


function callee() { 
    param($hash_params) 
    #$hash_params 
} 

test 

輸出爲System.Collections.Hashtable

但如果Write-HostWrite-Output再換下,

function test() { 
    $paramstring="name=vindhya 
    id=182122" 
    $hash_params = convertfrom-stringdata -stringdata $paramstring 
    Write-Output $hash_params 
    callee $hash_params 
} 


function callee() { 
    param($hash_params) 
    #$hash_params 
} 

test 

輸出是

Name       Value 

----       ----- 

name       vindhya 

id        182122 

爲什麼寫主機和寫輸出表現有所不同?

回答

3

Write-Output會將輸出傳遞到管道的下一個步驟。如果您處於管道末端,則會輸出到控制檯。

Write-Host將輸出到控制檯。如果輸出目標是一個對象,它將調用toString()方法將對象轉換爲字符串,然後輸出它。通常該字符串是對象的類型名稱。

您可以添加其他cmdlet,Out-String,在你的代碼,然後Write-Host將輸出類似的內容爲Write-Output

Write-Host ($hash_params | Out-String) 

我如下測試:

function test() { 
    $paramstring = "name=vindhya 
    id=18250" 
    $hash_params = convertfrom-stringdata -stringdata $paramstring 
    Write-Output $hash_params.toString() 
    Write-Host ($hash_params | Out-String) 
    callee $hash_params 
} 


function callee() { 
    param($hash_params) 
    #$hash_params 
} 

test 

輸出是:

System.Collections.Hashtable 

Name  Value 
----  ---- 
id   18250 
name  vindhya 
2

寫對象通過PowerShell的格式化引擎發送對象。這涉及檢查是否存在格式數據文件,其中包含對象類型的格式化指令。格式文件可以選擇各種不同的默認顯示格式:表,列表,寬等等。如果對象沒有格式化數據,PowerShell會使用其他標準(如公共屬性的數量)來確定是使用表格視圖還是列表視圖。作爲最後的手段,它會嘗試強制通常使用對象的ToString()方法的字符串。

寫主機不做任何事情(除了強制轉換爲字符串的最後部分)。它只顯示你提供的字符串。如果你提供的東西不是一個字符串,它會嘗試簡單的強制字符串,就是這樣。通常這隻會導致對象的類型名稱。

1

我在PowerShell中遇到過這個問題。我相信寫對象通常不是使用寫主機完成的 - 它看起來更適合字符串。如果你想寫對象,寫輸出是你需要使用的。

From the Powershell documentation,寫輸出用於「管道對象直到管道中的下一個命令」。由於沒有「下一個命令」,寫入輸出將在控制檯上打印對象。

此外,簡單地寫作$objName似乎在幕後調用Write-Output。因此,如果你願意來回報您的哈希表,你會怎麼做

function Foo { 
    # Generate $hash_params 
    $hash_params 
    return 
} 

,這將通過$hash_params到任何呼籲Foo

+0

此答案回答了我爲什麼使用wri的另一個問題te輸出如果只是寫一個變量會做.. – Dhatri

+0

謝謝! Powershell有點令人生畏,特別是如果你是從Bash進來的話;但其掛鉤到Windows可以提供大量的自動化功能。 – Vish

+0

yes.true.i總是感到困惑,因爲我期望bash行爲 – Dhatri