ForEach-Object cmdlet

Az előzőekben bemutatott FOREACH egy PowerShell kulcsszó ciklus létrehozására. Azonban létezik egy másik FOREACH is, ami a Foreach-Object cmdlet álneve:

[25] PS C:\> get-alias foreach

 

CommandType     Name                            Definition

-----------     ----                            ----------

Alias           foreach                         ForEach-Object

Honnan tudja a PowerShell hogy egy parancssorban most melyiket is akarom használni: a kulcsszót vagy az cmdletet? Nagyon egyszerűen: ha a foreach után egy zárójel „(” van, akkor kulcsszóval van dolga, ha „{” bajusz, akkor alias. Másrészt, a kulcsszavak mindig a kifejezések elején kell, hogy álljanak. A kifejezések eleje vagy a parancssor eleje, vagy pontosvessző (;), vagy nyitó zárójel „(”. A csőjel (|) nem számít kifejezés elejének.

Mire lehet használni ezt a foreach-object cmdletet? Míg a foreach kulcsszó tömbje, amin végigmegy, készen rendelkezésre kell, hogy álljon teljes egészében, mire a vezérlés ráadódik, addig a ForEach-Object cmdlet csővezetékből érkező elemeket dolgoz fel, azaz ha már egy bemeneti elem elkészült, akkor azt már át is veszi és elvégzi a kijelölt műveletet:

[1] PS C:\> 1,2,3 | ForEach-Object {$_ * 3}

3

6

9

A fenti példában nem a $foreach változón keresztül értem el az aktuális elemet, hanem a szokásos $_ változón.

Megjegyzés:

Van egy érdekessége ennek a cmdletnek. Figyeljük meg a help-ben a szintaxisát:

[2] PS C:\> get-help foreach-object

 

NAME

    ForEach-Object

 

SYNOPSIS

    Performs an operation against each item in a collection of input objects.

 

 

SYNTAX

    ForEach-Object [-Process] <ScriptBlock[]> [-Begin <ScriptBlock>] [-End <Sc

    riptBlock>] [-InputObject <PSObject>] [-RemainingScripts <ScriptBlock[]>]

    [-Confirm] [-WhatIf] [<CommonParameters>]

 

    ForEach-Object [-MemberName] <String> [-ArgumentList <Object[]>] [-InputOb

    ject <PSObject>] [-Confirm] [-WhatIf] [<CommonParameters>]

...

Hoppá! Nem is egy, hanem három szkriptblokkot lehet átadni neki paraméterként, kicsit hasonlóan, mint ahogy a FOR ciklusnál is három rész vezérli a ciklust. Itt a három rész szerepe: mit tegyen az első elem érkezése előtt, mit tegyen az éppen aktuális elemek érkezésekor, mit tegyen az utolsó elem érkezése után.

Nézzünk erre egy példát:

[13] PS C:\> "egy","kettő","három" | foreach-object {"----eleje----"} {$_} {"----vége----"}

----eleje----

egy

kettő

három

----vége----

Ebben a példában nem is írtam ki a paraméterek neveit, azaz a pozíció alapján rendelte hozzá az egyes szkriptblokkokat a PowerShell. Ha csak egy szkriptblokkot adunk meg az a Process szekcióhoz sorolódik.

A fenti megjegyzésben (PowerShell 3.0-tól kezdődően) látható, hogy egy második szintaxisa is van a ForEach-Object-nek. Ezzel a gaykoribb, egyszerűbb kifejezéseket tömörebben lehet összerakni. Például:

PS C:\> "egy", "kettő" | ForEach-Object -MemberName length

3

5

PS C:\> "egy", "kettő" | ForEach-Object -MemberName contains -ArgumentList g

True

False

Ez első példa hagyományosan így nézne ki:

PS C:\> "egy", "kettő" | ForEach-Object {$_.length}

A második meg így:

PS C:\> "egy", "kettő" | ForEach-Object {$_.contains("g")}

Azaz akár tulajdonságokat, akár metódusokat egyszerűen el tudunk érni.



Word To HTML Converter