停止PowerShell管道,确保调用end

时间:2015-06-03 17:11:42

标签: powershell pipeline powershell-v4.0

我尝试做的是在达到时间限制时获得停止管道输送的功能。我创建了一个测试函数如下:

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,行为似乎是相同的。

2 个答案:

答案 0 :(得分:2)

根据about_Functions

  

函数接收到管道中的所有对象后,结束   语句列表运行一次。如果没有Begin,Process或End关键字   使用时,所有语句都被视为End语句列表。

因此,您只需要省略else块。然后处理管道中的所有对象,但由于if子句,实际处理仅在达到时间限制之前完成。

答案 1 :(得分:0)

使用break / continue或抛出异常将不可避免地提前退出您的函数(并且还会中断/继续任何封闭循环)。

然而,您可以在begin块中嵌入一个清理函数,该函数实现您最初放入end块的内容,并从调用该函数您的{{ 1}}阻止 - 就在process - continue块之前:

end