Csoportosító operátorok

Sokfajta zárójelet használ a PowerShell, szedjük ezeket össze most ide egy helyre.

Gömbölyű zárójel: ()

Elsőként nézzük a gömbölyű zárójelet:

Zárójel

Használat, magyarázat

()

Egyszerű kifejezések kifejtése, beleértve az egyszerű kifejezéseket tartalmazó csővezetékeket

„Elfojtott” visszatérési értékű kifejezések visszatérési értékének megjeleníttetése

Példák:

[1] PS C:\>(1+2)*4

12

[2] PS C:\>(Get-Location).Drive

 

Name       Provider      Root                                CurrentLocatio

                                                                          n

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

C          FileSystem    C:\

 

 

[3] PS C:\>(get-childitem).count

42

[4] PS C:\>(1,2,3,-5,4,-6,0,-11 | where-object {$_ -lt 0}).count

3

Az [1]-es sor egyértelmű, meghatározom, hogy mely műveletet végezze előbb. A [2]-es sorban előbb kell elvégeztetni a Get-Location parancsot, hogy az ő kimenetének megnézhessem a Drive tulajdonságát. A [3]-as sorban a Get-ChildItem cmdlettel előbb létre kell hozni azt a gyűjteményt, aminek aztán megnézhetjük a számosságát. A [4]-es sorban látható, hogy a zárójelek között a csővezetékkel mindenféle műveletet is végezhetünk, például beirányítani egy következő cmdletbe.

Van még egy érdekes jelenség a PowerShellben, nézzünk egy egyszerű értékadást:

[21] PS I:\>$a = 1111

[22] PS I:\>

Nem ad semmilyen visszatérési értéket. A PowerShell alkotói úgy vélték, hogy ez a gyakoribb igény, azaz nem akarjuk viszontlátni az éppen most átadott értéket. Ezek az un. „voidable” kifejezések, amelyek esetében el lehet rejteni a visszatérési értéket. Ettől függetlenül, ha akarjuk, akkor meg lehet jeleníttetni a visszatérési értéket:

[28] PS I:\>($a = 1111)

1111

Hasonló módon, a növelés és csökkentés operátora sem ad alaphelyzetben kimenetet, de kicsikarhatjuk ezt is:

[63] PS C:\> $i=1

[64] PS C:\> $i++

[65] PS C:\> ($i++)

2

[66] PS C:\> $i

3

Dolláros gömbölyű zárójel: $()

Nézzük a következő csoportosítási lehetőséget!

Zárójel

Használat, magyarázat

$()

Több kifejezés szeparálása.

Idézőjelek közti kifejezés kifejtése.

Példák:

[3] PS C:\> ($a ="ab"; $b="lak"; $a+$b).length

Missing closing ')' in expression.

At line:1 char:10

+ ($a ="ab" <<<< ; $b="lak"; $a+$b).length

    + CategoryInfo          : ParserError: (CloseParenToken:TokenId) [], Pare

   ntContainsErrorRecordException

    + FullyQualifiedErrorId : MissingEndParenthesisInExpression

Ha a sima zárójelbe több kifejezést akarnánk beírni, akkor hibát kapunk, mint ahogy a [3]-as sor után látható. Ha ezt nem szeretnénk, akkor a $() változatot kell használni:

[4] PS I:\>$($a ="ab"; $b="lak"; $a+$b).length

5

Megjegyzés:

Itt, a [4]-es sorban egyébként pont jól jön nekünk az, hogy az értékadás nem ad alaphelyzetben kimenetet, hiszen így csak az $a+$b-re vonatkozóan kapjuk meg a hosszt, ami pont kell nekünk. Kényszerítsük például az első értékadást arra, hogy legyen kimenete:

[30] PS I:\>$(($a ="ab"); $b="lak"; $a+$b).length

2

Itt 2-t kaptunk kimenet gyanánt, merthogy ez már egy kételemű tömb, nem pedig egy valamekkora hosszúságú sztring.

Már korábban is tapasztaltuk ennek a speciális zárójelezésnek a jótékony hatását az idézőjeleknél:

[6] PS I:\>$g = "szöveg"

[7] PS I:\>"Ez a `$g hossza: ($g.length)"

Ez a $g hossza: (szöveg.length)

[8] PS I:\>"Ez a `$g hossza: $($g.length)"

Ez a $g hossza: 6

Ugye itt a [7]-ben nem tettem $ jelet, csak sima zárójelpárt, az idézőjel miatt csak a $g fejtődött ki, ezzel szemben a [8]-ban az egész kifejezés kiértékelődött.

Kukacos gömbölyű zárójel: @()

Zárójel

Használat, magyarázat

@()

Tömbkimenetet garantál.

A harmadik zárójelezés típus azt biztosítja, hogy mindenképpen tömb legyen a zárójelek közti művelet eredménye, ha csak egy elem amúgy a kimenet, akkor ezzel egy egyelemű tömböt fogunk kapni. Miért jó ez? Nézzünk erre egy példát:

[32] PS I:\>$tömb = "egy", "kettő", "három"

[33] PS I:\>$tömb.length

3

[34] PS I:\>$tömb = "egy", "kettő"

[35] PS I:\>$tömb.length

2

[36] PS I:\>$tömb = "egy"

[37] PS I:\>$tömb.length

3

Van egy $tömb változónk, amely változó számú elemet tartalmaz. Szükségünk van az elemszámra valamilyen művelet elvégzéséhez, ezért lekérjük a Length tulajdonságát. A [33]-ban és a [35]-ben jó eredményt kapunk, a [37]-ben, amikor már csak egyelemű a tömböm, akkor váratlanul nem 1-et, hanem 3-at kapok! Vajon miért? Mert ekkor „hirtelen” a $tömb-öm már nem is tömb, hanem már egy egyszerű sztring. Mivel ennek is van Length tulajdonsága, ezért nem kapunk hibát, viszont már más az egésznek a jelentése. Ha nem akarunk ilyen jellegű „hibát”, akkor rákényszeríthetjük a kifejezésünket arra, hogy mindenképpen tömböt adjon vissza:

[38] PS I:\>$tömb = "egy", "kettő", "három"

[39] PS I:\>@($tömb).length

3

[40] PS I:\>$tömb = "egy", "kettő"

[41] PS I:\>@($tömb).length

2

[42] PS I:\>$tömb = "egy"

[43] PS I:\>@($tömb).length

1

Így már teljesen konzisztens a megoldásunk.

Kapcsos zárójel: {} (bajusz)

A következő zárójeltípus a kapcsos zárójel (vagy bajusz):

Zárójel

Használat, magyarázat

{}

Szkriptblokk

Ezzel kapcsolatosan lesz egy külön fejezet, de elöljáróban annyit, hogy kódrészleteket tudunk ezzel csoportosítani, illetve ténylegesen kódként kezelni:

[46] PS C:\scripts> $script = {$dátum = get-date; $dátum}

[47] PS C:\scripts> $script

$dátum = get-date; $dátum

[48] PS C:\scripts> $script | Get-Member

 

 

   TypeName: System.Management.Automation.ScriptBlock

 

Name             MemberType Definition

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

Equals           Method     System.Boolean Equals(Object obj)

GetHashCode      Method     System.Int32 GetHashCode()

GetType          Method     System.Type GetType()

get_IsFilter     Method     System.Boolean get_IsFilter()

Invoke           Method     System.Collections.ObjectModel.Collection`1[...

InvokeReturnAsIs Method     System.Object InvokeReturnAsIs(Params Object...

set_IsFilter     Method     System.Void set_IsFilter(Boolean value)

ToString         Method     System.String ToString()

IsFilter         Property   System.Boolean IsFilter {get;set;}

 

 

[49] PS C:\scripts> $script.invoke()

 

2008. április 22. 23:33:35

A [46]-ban úgy néz ki, mintha a $()-t használtuk volna, de a [47]-ben kiderült, hogy mégsem ugyanaz a helyzet, hiszen a $script-változónk nem a zárójeles kifejezés értékét kapta meg, hanem magát a kifejezést. De mégsem sztringgel van dolgunk, hiszen a Get-Member-rel nem a sztringekre jellemző tagjellemzőket kapjuk meg, hanem a típusnál is látjuk, hogy ez egy ScriptBlock . Ennek fő jellemzője, hogy van neki egy invoke  metódusa, amellyel végre is lehet hajtatni, mint ahogy a [49]-ben látjuk.

Dolláros kapcsos zárójel: ${}

Zárójel

Használat, magyarázat

${}

Változó nevének operátora

Psmeghajtó elemének kiolvasása

Ezt már mutattam, de azért ismétlésképpen szerepeljen itt újra. Ezzel a jelöléssel lehet bonyolult nevű változókat is használni:

[10] PS C:\> ${ilyen név nem lehetne} = 1

[11] PS C:\> ${ilyen név nem lehetne}

1

Ugyanezt a jelölésrendszert tudjuk használni különböző PSmeghajtók tartalmának kiolvasásához is:

[19] PS C:\> ${function:cd..}

Set-Location ..

Ez a kifejezés is hibát adna a kapcsos zárójelek nélkül.

Szögletes zárójel: []

Az utolsó zárójeltípus ugyan nem csoportosít, de ha már itt vannak a zárójelek, akkor tegyük ezt is ide:

Zárójel

Használat, magyarázat

[]

Tömbindex

Típusoperátor

Példák:

[5] PS I:\>(1,2,3,4,5)[2]

3

[6] PS I:\>(1,2,3,4,5)[0]

1

[7] PS I:\>[int] "00011"

11

[8] PS I:\>[datetime]::now

 

2008. március 14. 10:28:39

Az [5]-ös és [6]-os sorokban tömbindex szerepben látjuk a szögletes zárójelet, a [7]-es és [8]-as sorban típusjelöléshez használtam.



Word To HTML Converter