2016-03-15 1 views
1

je voudrais construire pipeline powershell commestdout PowerShell et rediriger

cmd | transform_a | stdout_and | transform_b | store_variable 
         ^
         | 
    copy input to next consumer and to console 

J'ai essayé d'utiliser Tee-Object mais sans succès. Je ne veux pas faire cela

dir | select -last 5 | tee lastFiveLines | select -first 1 
echo $lastFiveLines 

même si cela fonctionne. Au lieu de cela, je veux que le contenu soit imprimé directement.

Répondre

2

Vous pouvez essayer une boucle foreach et Out-Default ou Out-Host pour ignorer le reste du pipeline (l'hôte est la sortie par défaut de toute façon), tout en envoyant également l'objet dans le pipeline. Exemple:

Get-ChildItem | 
Select-Object Name, FullName | 
ForEach-Object { 
    #Send Name-value directly to console (default output) 
    $_.Name | Out-Default 
    #Send original object down the pipeline 
    $_ 
} | 
Select-Object -ExpandProperty FullName | % { Start-sleep -Seconds 1; "Hello $_" } 

Vous pouvez créer un filtre pour faciliter sa réutilisation.

#Bad filter-name, but fits the question. 
filter stdout_and { 
    #Send Name-value directly to console (default output) 
    $_.Name | Out-Default 
    #Send original object down the pipeline 
    $_ 
} 

Get-ChildItem | 
Select-Object Name, FullName | 
stdout_and | 
Select-Object -ExpandProperty FullName | % { Start-sleep -Seconds 1; "Hello $_" } 
+0

Merci 'foreach' a fait l'affaire – svobol13

+0

Donc, pas un beau doublure pour la tâche? – SerG

+0

Vous pouvez supprimer les sauts de ligne dans foreach .. 'ForEach-Object {$ _. Nom | Out-Default; $ _} ', ou créez un filtre (voir la réponse mise à jour). –