2013-01-09 10 views
8

Mam skrypt, do którego próbuję dodać funkcję potoku. Widzę jednak dziwne zachowanie, w którym skrypt wydaje się działać tylko w stosunku do końcowego obiektu w potoku. Na przykład:Tylko skrypt przetwarza ostatni obiekt z potoku

param(
    [parameter(ValueFromPipeline=$true)] 
    [string]$pipe 
) 

foreach ($n in $pipe) { 
    Write-Host "Read in " $n 
} 

Martwy prosty, nie? Następnie uruchamiam 1..10 | .\test.ps1 i wyprowadza tylko jedną linię Read in 10. Dodając do złożoności, rzeczywisty scenariusz chcę użyć to w ma więcej parametrów:

[CmdletBinding(DefaultParameterSetName="Alias")] 
param (
    [parameter(Position=0,ParameterSetName="Alias")] 
    [string]$Alias, 

    [parameter(ParameterSetName="File")] 
    [ValidateNotNullOrEmpty()] 
    [string]$File 

    <and so on> 
) 

Odpowiedz

11

Trzeba owinąć główną część skryptu z procesu {}, to wtedy pozwalają przetworzyć każdy pozycja na rurociągu. Ponieważ proces zostanie wywołany dla każdego przedmiotu, możesz nawet usunąć pętlę for.

Więc twój skrypt brzmienie:

param(
    [parameter(ValueFromPipeline=$true)] 
    [string]$pipe 
) 
process 
{ 
     Write-Host "Read in " $pipe 
} 

Można przeczytać o przetwarzaniu wejściowego tutaj: Function Input Processing Methods

+0

który pracował w moim prostego skryptu testowego powyżej, ale kiedy mogę umieścić go w moim skrypcie, to faktycznie uruchamia proces Get-Process (i kończy się niepowodzeniem, ponieważ otrzymuje blok skryptu dla parametru Name). – ASTX813

+0

Czy umieścisz swój pełny skrypt lub przynajmniej istotne części w swoim pytaniu? –

+0

Ponieważ moje pole rozwoju nie pozwala mi kopiować i wklejać, nie będę w stanie tego ciągnąć. Mogę powiedzieć, że próbowałem dodać więcej złożoności do skryptu testowego i znalazłem wyzwalacz. Kiedy dodałem funkcję "function something {Write-Host"} przed blokiem procesu {} w skrypcie testowym, zrobiło to samo. Jeśli jednak zawijam cały blok w procesie {}, działa skrypt testowy. – ASTX813

Powiązane problemy