管道0..10到高级功能

时间:2017-06-07 19:21:02

标签: powershell

我无法解决为什么管道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是什么,并希望得到社区的帮助。

2 个答案:

答案 0 :(得分: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显示了一些不错的示例。

从下面的@ Chris-Magnuson那里读到链接,我想出了一些很好的代码,可以准确地显示正在发生的事情:

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

有点时髦,我会说。

答案 1 :(得分:4)

您需要添加一个流程块以获得所需的行为:

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

如果没有process {},则表示函数中的所有代码都在end {}中运行,而这只会在集合中的最后一个数字处运行。

我发现有关此主题的最佳文章是this one

文章中的

This chart总结了一切,但在我理解之前,我花了很多次阅读它。