dans PowerShell V2, la ligne suivante: afficherait: p> puisque tous les éléments ont été poussés dans le pipeline. Cependant, en V3, la ligne ci-dessus affiche uniquement: P> function Start-Enumerate ($array) {
do{ $array } while($false)
}
Start-Enumerate (1..3)| foreach {if($_ -ge 2){break};$_}; 'V2 Will Not Get Here'
3 Réponses :
Vérifiez cet article sur la façon dont vous pouvez annuler un pipeline:
http://powershell.com/cs /blogs/tobias/archive/2010/01/01/canceling-a-pipeline.aspx
dans PowerShell 3.0 C'est une amélioration des moteurs. À partir du dossier Samples CTP1 ('\ Moteurs Demos \ Misc \ Misc \ ConnectBugFixes.ps1'): P>
# Connect Bug 332685 # Select-Object optimization # Submitted by Shay Levi # Connect Suggestion 286219 # PSV2: Lazy pipeline - ability for cmdlets to say "NO MORE" # Submitted by Karl Prosser # Stop the pipeline once the objects have been selected # Useful for commands that return a lot of objects, like dealing with the event log # In PS 2.0, this took a long time even though we only wanted the first 10 events Start-Process powershell.exe -Args '-Version 2 -NoExit -Command Get-WinEvent | Select-Object -First 10' # In PS 3.0, the pipeline stops after retrieving the first 10 objects Get-WinEvent | Select-Object -First 10
Pour autant que je puisse le dire, il jette une exception StroppstreamCommandsException, qui est très similaire à ce que Tobias fait dans le poste que j'ai mentionné.
Mais contrairement à la pipelinestoppedexception, Select-Object code> n'empêche pas les commandes en aval de compléter. J'aimerais pouvoir arrêter le pipeline sans demander à l'utilisateur de savoir qu'il doit envelopper le pipeline dans un processus de travail ou de pratiquer, mais je suppose que cela ne peut pas utiliser stopuptreamcommandSexception car c'est un type privé.
Je sais que jeter une pipelinestoppedException qui arrête le pipeline. L'exemple suivant simulera ce que vous voyez avec Select -First 1 code> dans v3.0, dans v2.0:
Vous avez un typo: $ poing> $ premier. Et et «nouveau» devrait être un nouvel objet.
Le problème que j'ai avec le lancement d'une pipelinestoppedException est que les commandes en bas de la pipeline ne finissent pas le traitement. Cela fonctionne: 1..5 | Sélectionnez -Le 3 | Mesurer code>, mais cela ne fait pas:
1..5 | SELECT-AMÉLIORÉ -PIRT 3 | Mesurer code>
Après avoir essayé plusieurs méthodes, y compris lancer stopuptreamcommandsexception, actionpreferencestopException et pipelineclosexception, appelant $ PSCMDlet.throwterminderError et $ exécutionContext.get.runspace.gecurmingrunningpipeline () était la seule chose qui n'a pas abandonné l'ensemble du script (contre le pipeline). [Notez que certains des éléments mentionnés ci-dessus nécessitent l'accès aux membres privés, que j'ai accédé via la réflexion.] nouvelle méthode suit en fonction du commentaire de OP. Malheureusement, cette méthode est beaucoup plus compliquée et utilise des membres privés. De plus, je ne sais pas à quel point cela est robuste - je viens de recevoir l'exemple de l'OP de travailler et d'arrêté là-bas. SO FWIW: P>
$proc = (gps)[12] # semi-random process
$methinfo = $proc.gettype().getmethod("GetComIUnknown", $bindFlags)
# Return ComIUnknown as an IntPtr
$comIUnknown = $methinfo.Invoke($proc, @($true))
Cela ne fait pas ce que je cherche. 1..5 | Sélectionnez -Le 3 | mesure -sum code> renvoie un résultat, mais
1..5 | % {if ($ _ -ge 4) {stop-pipeline}} | mesure -sum code> ne le fait pas. Je souhaite arrêter de nouveaux articles d'être envoyé par le pipeline, mais permettez au pipeline de finir le traitement.
Pouvez-vous inclure le code de la méthode Invoke-méthode code> et
Select-Propriétés code> Fonctions? Le code fourni ne fonctionnera pas sans ces fonctions.
J'ai écrit la méthode Invoke et Select-Propriétés au travail, je devrais donc passer à travers un processus complet pour obtenir la permission de les publier. Cependant, je vais ajouter du code de réflexion PS à l'exemple qui vous obtiendra la majeure partie du chemin.
Vous recherchez donc stopuptreamcommandsexception, mais vous ne pouvez pas l'utiliser car il est interne. Voici une suggestion MS Connect pour cela: Connect.Microsoft.com/powershell/feedback/Détails/768650/...
Merci, @larstruijens pour me faire remarquer cela; J'ai voté ça.