Wie funktioniert Select-Objekt Stopp der pipeline in der PowerShell v3?
In der PowerShell v2, die folgende Zeile:
1..3| foreach { Write-Host "Value : $_"; $_ }| select -First 1
Anzeigen würde:
Value : 1
1
Value : 2
Value : 3
Da alle Elemente geschoben wurden entlang der pipeline. Jedoch, in v3 die oben genannten Zeile wird nur angezeigt:
Value : 1
1
Die pipeline angehalten wird, bevor die 2 und 3 gesendet werden, um Foreach-Object
(Hinweis: die -Wait
Schalter für Select-Object
erlaubt es, alle Elemente zu erreichen, die foreach
block).
Wie funktioniert Select-Object
Stopp der pipeline, und ich kann jetzt aufhören, die pipeline von einem foreach
oder aus meiner eigenen Funktion?
Edit: ich weiß, ich kann wickeln, die eine pipeline in eine do...while-Schleife und weiterhin aus der pipeline. Ich habe auch festgestellt, dass in der v3 kann ich tun so etwas wie dieses (es funktioniert nicht in v2):
function Start-Enumerate ($array) {
do{ $array } while($false)
}
Start-Enumerate (1..3)| foreach {if($_ -ge 2){break};$_}; 'V2 Will Not Get Here'
Aber Select-Object
erfordert nicht eine dieser Techniken, so hoffte ich, dass es eine Möglichkeit, die pipeline zu stoppen von einem einzelnen Punkt in der pipeline.
- So suchen Sie nach StopUpstreamCommandsException, aber Sie können nicht verwenden, da es intern ist. Hier ist ein MS-connect-Vorschlag für Sie: connect.microsoft.com/PowerShell/feedback/details/768650/...
- Danke, @LarsTruijens für den Hinweis mich; ich habe es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen Sie in diesem Beitrag, wie Sie können Abbrechen, die eine pipeline:
http://powershell.com/cs/blogs/tobias/archive/2010/01/01/cancelling-a-pipeline.aspx
In der PowerShell 3.0 ist es ein Motor der Verbesserung. Von der CTP1 samples-Ordner ('\Engines Demos\Misc\ConnectBugFixes.ps1'):
Select-Object
nicht verhindern, dass downstream-Befehle abschließen. Ich möchte in der Lage sein, die pipeline zu stoppen, ohne dass der Benutzer wissen, dass Sie umschließen die pipeline in eine do-while-oder try-catch, aber ich nehme an, ein nicht verwenden können, StopUpstreamCommandsException da es ein privater Typ.Nach dem Versuch mehrere Methoden, einschließlich werfen StopUpstreamCommandsException, ActionPreferenceStopException, und PipelineClosedException, Aufruf $PSCmdlet.ThrowTerminatingError " und $ExecutionContext.Host.Runspace.GetCurrentlyRunningPipeline().stopper.set_IsStopping($true) schließlich fand ich, dass nur die Verwendung von select-Objekt war das einzige, was nicht Abbrechen, das ganze Skript (im Vergleich zu nur der pipeline). [Beachten Sie, dass einige der oben genannten Punkte benötigen Zugriff auf private member, die ich per reflection zugegriffen.]
Neue Methode folgt, basierend auf Kommentar aus OP. Leider ist diese Methode viel komplizierter und Verwendungen, von privaten Mitgliedern. Auch weiß ich nicht, wie robust - ich habe gerade die OP ' s Beispiel funktioniert und es gestoppt. Also FWIW:
PowerShell-code abrufen PipelineProcessor Wert durch Reflexion:
Powershell-code zum aufrufen der Methode anhand von reflektion:
1..5| select -First 3 | measure -Sum
gibt ein Ergebnis zurück, aber1..5| %{if($_ -ge 4) {stop-pipeline}} | measure -Sum
nicht. Ich will halt neue Objekte über die pipeline übergeben, aber erlauben, die pipeline-Verarbeitung.invoke-method
undselect-properties
Funktionen? Der mitgelieferte code wird nicht funktionieren, ohne diese Funktionen.Ich weiß, dass das werfen einer PipelineStoppedException beendet die pipeline. Das folgende Beispiel simuliert, was Sie sehen, mit
Select -first 1
in v3.0 in v2.0:1..5| select -first 3| measure
, aber das heißt nicht:1..5| Select-Improved -first 3| measure