Was ich versuche zu tun, ist eine Funktion, um den Pipeline-Feed zu stoppen, wenn ein Zeitlimit erreicht wurde. Ich habe eine Testfunktion wie folgt erstellt:Stoppen PowerShell-Pipeline, stellen Sie sicher, Ende heißt
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" }
}
Dies wird sicherlich die Pipeline stoppen, aber es nie ruft mein „end {}“ Block, der in diesem Fall lebenswichtig ist. Weiß jemand, warum mein Block "end {}" nicht aufgerufen wird, wenn ich die Pipeline mit "Weiter" stoppe? Das Verhalten scheint identisch zu sein, wenn ich eine PipelineStoppedException werfe.
Vermutlich springt 'continue' aus seiner beinhaltenden Schleife heraus, nur gibt es keine, so dass es sich von Ihrer gesamten Funktion entfernt. Das ist aber nicht gerade hilfreich. Ich bin mir nicht sicher, ob es einen richtigen Weg gibt, um das zu tun, was Sie hier versuchen wollen. –
Wie ich es verstehe, werden Cmdlets wie Select-Object -First 1 die StopUpstreamCommandsException auslösen, um die Pipeline zu stoppen, was eine interne Ausnahme ist und nicht für meine eigene Verwendung sichtbar ist. :( –
Vielleicht setzen Sie Ihre 'end {}' Verarbeitung in einen anderen Skriptblock, den Sie aus der 'else {}' Klausel in 'process {}' aufrufen können? –