Sokfajta zárójelet használ a PowerShell, szedjük ezeket össze most ide egy helyre.
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
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.
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.
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.
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.
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.