我尝试做的是在达到时间限制时获得停止管道输送的功能。我创建了一个测试函数如下:
function Test-PipelineStuff
{
[cmdletbinding()]
Param(
[Parameter(ValueFromPipeLIne=$true)][int]$Foo,
[Parameter(ValueFromPipeLIne=$true)][int]$MaxMins
)
begin {
"THE START"
$StartTime = Get-Date
$StopTime = (get-date).AddMinutes($MaxMins)
"Stop time is: $StopTime"
}
process
{
$currTime = Get-Date
if( $currTime -lt $StopTime ){
"Processing $Foo"
}
else{
continue;
}
}
end { "THE END" }
}
这肯定会阻止管道,但它永远不会调用我的" end {}"块,在这种情况下是至关重要的。有谁知道为什么我的"结束{}"当我使用&#34停止管道时,不会调用块;继续"?如果我抛出PipelineStoppedException,行为似乎是相同的。
答案 0 :(得分:2)
函数接收到管道中的所有对象后,结束 语句列表运行一次。如果没有Begin,Process或End关键字 使用时,所有语句都被视为End语句列表。
因此,您只需要省略else
块。然后处理管道中的所有对象,但由于if
子句,实际处理仅在达到时间限制之前完成。
答案 1 :(得分:0)
使用break
/ continue
或抛出异常将不可避免地提前退出您的函数(并且还会中断/继续任何封闭循环)。
然而,您可以在begin
块中嵌入一个清理函数,该函数实现您最初放入end
块的内容,并从调用该函数您的{{ 1}}阻止 - 就在process
- 和 continue
块之前:
end