2014-09-10 21 views
1

我想了解Powershell,但發現一些不太直觀的東西。我的理解是,在管道中傳遞對象,而不是傳統的文本。 $ _引用管道中的當前對象。那麼,爲什麼下面不工作:

get-date|Write-Host "$_" 

的errormessage的是:

寫主持人:輸入對象不能綁定到任何參數的命令,或者是因爲該命令不採取管道輸入或輸入及其屬性不會與輸入管道輸入的任何參數相匹配。 在線:1 char:10 + get-date | Write-Host $ _ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~(10-9-2014 15:17:09) 00:PSObject)[寫 - 主機],ParameterBindingException + FullyQualifiedErrorId:InputObjectNotBound,Microsoft.PowerShell.Commands.WriteHostCommand

+1

「Write-Host」cmdlet不接受管道輸入,這就是您收到錯誤的原因。有關如何在此情況下使用管道的示例,請參閱LightningIsMyName。有許多cmdlet可以接受流水線輸入。 '寫主機'根本不是其中之一 – Matt 2014-09-10 13:35:34

回答

6

$_是在管道中的當前單個項目。寫在管道中,你會寫

get-data | foreach { Write-Host $_ } 

每個項目或在短期形式

get-data |% { Write-Host $_ } 

概念,FOREACH是接收功能參數,管道輸入,並在每個應用功能的小命令管道項目。您不能只使用$_編寫代碼 - 您需要有一個函數明確指出它同意接收管道輸入

+0

請參閱http://technet.microsoft.com/en-us/library/hh847902.aspx和http://technet.microsoft.com/en-us/library/hh847743 .aspx有關定義管道輸入的更多信息 – 2014-09-10 13:25:37

+0

好吧,我有點這樣做,但並不完全。根據「get-help Write-Host -parameter *」,位置參數-Object接受流水線輸入,實際上「get-date | Write-Host」起作用。那麼,使用$ _代替管道輸入和直接使用管道輸入的命令有什麼區別。僅僅是因爲$ _是一個數組(因此需要使用foreach),並且在這種情況下,您將能夠獲得第一個項目,如$ _ [0]? – Edwin 2014-09-12 14:03:45

+1

雖然寫主機願意從流水線獲得它的輸入(即如果未指定,則Object參數自動綁定到管道),但您對「Write-Host $ _」所做的操作是指定對象,所以它是綁定到'$ _'而不是管道。但'$ _'實際上並不是管道數據 - 它是一個變量,它只由您爲其提供的函數的foreach函數定義 – 2014-09-13 09:14:46