2012-05-31 38 views
87

我對打印(回顯)到控制檯的各種方法有點混淆。我已經看到,有多種方法將輸出寫入到控制檯,如:在PowerShell中寫入控制檯的最佳方式

Write-Host "Hello world1" 
"Hello World2" 
Out-Host -InputObject "Hello World3" 

所有三種方法將打印到控制檯。中間的一個比較簡單,不那麼冗長,更易於使用。我還發現,當你寫一個函數,例如:

function GetValues() 
{ 
    "1" 
    "2" 
} 

它仍然返回管道兩個字符串:

,我仍然能夠打印出的值:

foreach ($s in GetValues) 
{ 
    Write-Host "s: " $s 
} 

我發現的事情是,僅使用帶引號的字符串並不總是出現在自定義主機上,而我不得不使用Write-Host來獲取在自定義主機上打印的值。

不知怎的,我覺得這很迷惑。 "Print something"應該是Write-Host的別名,或者意圖是什麼?

+2

[寫入主機是邪惡](http://windowsitpro.com/blog/what-do-not-do-powershell-part-1) –

回答

64

PowerShell的默認行爲只是將所有掉出管道但不被另一個管道元素拾取或分配給變量(或重定向到Out-Host)的所有內容。 Out-Host所做的顯然是與主機相關的。

只是讓東西掉下來的管道是Write-Host的替代品,其存在於宿主應用程序輸出文本的唯一原因。

如果要輸出,請使用Write-* cmdlet。如果您想從函數返回值,則只需在沒有任何cmdlet的情況下將對象轉儲到那裏。

+0

爲什麼寫主機「你好世界」拋出錯誤「預期結束語句」? – FrenkyB

+0

我不知道。在PowerShell中鍵入它在這裏顯示預期的行爲,並且不會出現錯誤。 – Joey

+1

我已經在.vbs腳本中輸入了。只是這一行代碼,它是拋出我的錯誤。 – FrenkyB

35

中間的一個寫入管道。 Write-HostOut-Host寫入控制檯。 'echo'是Write-Output的別名,它也寫入管道。寫入控制檯的最佳方法是使用Write-Host cmdlet。

當一個對象寫入管道時,它可以被鏈中的其他命令使用。例如:

"hello world" | Do-Something 

但是這不會工作,因爲Write-Host寫入控制檯,而不是管道(DO-東西不會得到的字符串):

Write-Host "hello world" | Do-Something 
+3

這個答案在技術上是正確的,但我懷疑它會導致新手PowerShell用戶誤入歧途。有效的PowerShell的第一條規則是生成在管道中很有用的輸出。如果你非常使用寫主機,你可能會做錯了。 – OldFart

+3

那麼,這不是OP問的問題,如何寫入控制檯?寫入主機和寫入管道是有區別的,並且必須知道每個人做了什麼。我會通過澄清更新我的答案。 –