我无法解决为什么管道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
是什么,并希望得到社区的帮助。
答案 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总结了一切,但在我理解之前,我花了很多次阅读它。