10
votes

Comment Select-Object arrêtez-t-il le pipeline de PowerShell V3?

dans PowerShell V2, la ligne suivante: xxx pré>

afficherait: p> xxx pré>

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'


2 commentaires

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.


3 Réponses :


3
votes

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


2 commentaires

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 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é.



1
votes

Je sais que jeter une pipelinestoppedException qui arrête le pipeline. L'exemple suivant simulera ce que vous voyez avec Select -First 1 dans v3.0, dans v2.0: xxx


2 commentaires

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 , mais cela ne fait pas: 1..5 | SELECT-AMÉLIORÉ -PIRT 3 | Mesurer



3
votes

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.] xxx pré>


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))


3 commentaires

Cela ne fait pas ce que je cherche. 1..5 | Sélectionnez -Le 3 | mesure -sum renvoie un résultat, mais 1..5 | % {if ($ _ -ge 4) {stop-pipeline}} | mesure -sum 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 et Select-Propriétés 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.