jakiś czas temu pisałem o tym, jak powinno się/można przekazywać wartości via pipeline. krótki komentarz…
clue jest takie, że:
- trzeba włączyć funkcje zaawansowane cmdletbinding()
- użyć bloku 'process {}’ dzięki czemu każdy element będzie automatycznie procesowany przez ten blok kodu za każdym razem po 'wpadnięciu’ do potoku.
- dzięki temu można usunąć 'foreach’ bo blok 'process’ i tak wykona się dla każdego elementu.
warto się sqpić nad konsekwencją tego faktu. tablice przekazywać na [co najmniej] dwa podstawowe sposoby – jako potok oraz jako parametr:
1..10|.\test-multiValue.ps1 .\test-multiValue.ps1 (1..10)
… ale po usunięciu 'foreach’ ze skryptu, przestanie działać prawidłowo przekazanie przez zmienną wyliczaną…
aby przekonać się o tym, można uruchomić poniższy skrypt, na oba sposoby, różniący się od poprzedniego wpisu tylko weryfikacją czy element jest tablicą:
[cmdletbinding()] param( [parameter(mandatory=$true,valueFromPipeline=$true,position=0)][string[]]$identities ) begin { write-host 'begin' if($identities -is [System.Array]) { write-host 'array' } } process { write-host 'jakis text, zeby pokazac, ze zostanie wyswietlony FOREACH element' write-host $identities } end { write-host 'end.' }
reasumując
dla zachowania możliwości wykonania zarówno poprzez potok jak i przez zmienną, lepiej zostawić pętlę foreach – nic złego nie robi.
eN.
Mateusz Nadobnik