przekazywanie wartości – c.d.

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.

93.WGUiSW

szybkie przypomnienie dla tych, którzy wybierają się dziś na spotkanie WGUiSW, żeby się zapisać na meetupie. jeśli ktoś używa nicka, wyślijcie imię i nazwisko Pawłowi. osoby nie będące na liście nie zostaną wpuszczone przez ochronę /:

eN.