从 CmdLet 发送到管道的项目是立即传递到下一个 CmdLet,还是进入一个内部 PS“累加器”,将它们存储起来,直到当前 CmdLet 完成,然后将它们送入下一个?
有没有可以配置连续模式的参数?如果 CmdLet 采用单个对象,则可以在数据进入管道时调用它,但如果 CmdLet 采用数组,则 PS 可能会累积并将整个数组送入。例如,排序需要一个完整的集合。
我对编写长期运行的、开放式的、流式的 CmdLets 很感兴趣。
谢谢。我找不到关于管道的任何深入讨论。
从 CmdLet 发送到管道的项目是立即传递到下一个 CmdLet,还是进入一个内部 PS“累加器”,将它们存储起来,直到当前 CmdLet 完成,然后将它们送入下一个?
有没有可以配置连续模式的参数?如果 CmdLet 采用单个对象,则可以在数据进入管道时调用它,但如果 CmdLet 采用数组,则 PS 可能会累积并将整个数组送入。例如,排序需要一个完整的集合。
我对编写长期运行的、开放式的、流式的 CmdLets 很感兴趣。
谢谢。我找不到关于管道的任何深入讨论。
第一部分:不,PowerShell 函数不一定会立即传递到 cmdlet,而是会传递到名为 $input 的特殊变量中。
$input 在函数开始执行之前填充了所有传入的管道对象。如有必要,PowerShell 甚至可能会延迟执行,直到所有传入管道数据完成。
第二部分:如果你想连续处理你的数据而不是等待它进入并存储在 $input 中,你可以在编写函数/过滤器时使用filter关键字代替function关键字(过滤器的行为类似于函数,只是它们不等待数据,而是在数据可用时使用它)。
例如
filter Get-OddEven {
$x = $_ % 2
# ... other logic here
}
希望这会有所帮助,以免我抄袭,所有这些都来自Jerry Lee Ford, Jr 的“Microsoft Windows PowerShell Programming For the Absolute Beginner”一书,如果您想进一步了解的话。