2017-06-07 77 views
2

我不能找出爲什麼管道0..10不通過我的功能來直接傳遞它。管道0..10到高級功能

我預計管道0..10以下函數將返回10個結果。

function a{param([parameter(ValueFromPipeline=$true)][int[]]$t)$t|%{$_+10}} 
0..10 | a 

我不明白爲什麼以下只返回一個結果。

我預計將會傳入一個值塊,並且$t | %{$_+10}會分解它們,對它們進行操作並將它們返回到輸出。

它按預期工作,如果我運行下面的

a(0..10) 

我覺得沒有什麼是錯的,只是我不明白0..10是,並希望得到來自社會的一些幫助。

回答

6

最好的辦法是,如果沒有

BEGIN {} 
PROCESS {} 
END {} 

結構高級功能都非常混亂,當談到從管道和陣列接受。

這裏發生的事情是,如果沒有PROCESS {}塊,函數中的$ T就是一個INT [],並作爲數組傳遞。你的foreach過程,但返回的命令的最後結果 - 10 + 10

更改您的代碼:你期待什麼

function a{ 
    param([parameter(ValueFromPipeline=$true)][int[]]$t) 
    BEGIN {} 
    PROCESS{  
    $t | %{$_+10} 
    } 
    END {} 
} 

回報 - $ T的每個元素傳遞給在foreach再往下管道。

下面是一個MS PowerShell傢伙的鏈接:Windows PowerShell: The Advanced Function Lifecycle顯示了一些很好的例子。

閱讀來自@克里斯 - 馬格努森下面的鏈接,我想出了偉大的代碼,準確顯示發生的事情:

Function AA { 
    Begin {"Begin: The input is $input , Pipeline is $_"} 
    End {"End:   The input is $input , Pipeline is $_" } 
} 

PS C:\Temp> 1,2,3 | AA 
Begin: The input is , Pipeline is 
End:   The input is 1 2 3 , Pipeline is 

Function BB { 
    Begin {"Begin: The input is $input , Pipeline is $_" } 
    Process {"Process: The input is $input , Pipeline is $_" } 
    End  {"End:   The input is $input , Pipeline is $_" } 
} 

PS C:\Temp> 1,2,3 | BB 
Begin: The input is , Pipeline is 
Process: The input is 1 , Pipeline is 1 
Process: The input is 2 , Pipeline is 2 
Process: The input is 3 , Pipeline is 3 
End:   The input is , Pipeline is 3 

質樸的善良,我會說。

+0

感謝您提供快速而全面的答案 –

4

您需要添加一個過程塊得到你想要的行爲:

function a{param([parameter(ValueFromPipeline=$true)][int[]]$t)process{$t|%{$_+10}}}

如果沒有process {}這是暗示,在函數的所有代碼end {}運行,這將只運行它你最後一個號碼。

我找到的關於此主題的最佳文章是this one

This chart從文章中總結了一切,但在我理解它之前,我花了很多次閱讀它。明白這一點

+0

這正是我需要的信息。謝謝。 –