A PowerShell programozási nyelv

Utasítások, vezérlési szerkezetek

Utasítások

Bevezetés

Az utasítások szerkezete PowerShellben mindig a következő: "ige"-"főnév". Ez a szerkezet és még néhány más dolog, amit a későbbiekben látni fogunk, nagyon kényelmessé teszi a Windows PowerShell használatát.

A Windows PowerShell által használt igék itt találhatóak.

A PowerShell szemlélete az, hogy a beépített utasítások egyszerűen használhatóak legyenek és egyszerű szolgáltatásokat nyújtsanak.

Néhány hasznos utasítás

Az erőforrások elérésére a Windows PowerShell a "get" igét használja. Szemben más nyelvekkel, nincs megkülönböztetve, hogy milyen erőforrást kívánunk elérni, minden ilyen esetben a "get" kulcsszót kell használnunk (vesd össze pl. Bash: open, cat, display, find stb.).

A "get" párja a "set", ezzel erőforrásoknak adhatunk új értéket.

get-command

A get-command utasítás segítségével lekérdezhetjük az aktuális PowerShell munkamenetből elérhető utasításokat. Amennyiben paraméter nélkül hívjuk meg, kilistázza az összes elérhető utasítást, paraméterként azonban érdemes megadni az utasítás nevének ismert részét, így szűkítve a találatokat.

Például ha szükségem van arra a parancsra, ami kilistázza a futó folyamatokat és tudom, hogy valahol a parancs nevében benne van a "process" szó:

PS> get-command *process*

Vegyük észre, hogy a keresett utasítás alakja megfelel a bevezetőben említett szerkezetnek, hiszen erőforrásokat (futó folyamatokat) érünk el a segítségével.

get-help

Amikor nem tudjuk, hogy egy utasítást hogyan kell használni, mik a paraméterei stb. akkor érdemes kiadnunk ezt az utasítást.

Amennyiben paraméter nélkül hívjuk meg, önmagáról ad leírást - amennyiben egyéb kapcsolót nem használunk - az ilyen leírások szerkezete a következő:

Például ha a "get-process"-ről szeretnénk információkat kapni:

PS> get-help get-process

Az alábbi kapcsolókat használhatjuk a get-help utasításnál:

Amennyiben nem parancsokkal, hanem a PowerShell használatával kapcsolatos kérdésünk merül fel és az MSDN valamilyen okból nem elérhető, akkor a PowerShell beépített segédanyagait is a get-help utasítás segítségével érhetjük el.

Az ilyen segédanyagok mindig "about_" -al kezdődnek (idézőjelek nélkül). Ahhoz, hogy megkapjuk az összes beépített segédanyagot tartalmazó listát, az alábbi utasítást kell kiadnunk:

PS> get-help about*

A leggyakrabban használt segédanyagok:

sort

A sort alapértelmezés szerint növekvő sorrendbe rendez a megadott paraméter szerint. A UNIX-os parancsokkal szemben PowerShellben az utasításoknak csak egyféle implementációja van.

Szemben a UNIX-os ps-el, a PowerShell sort-ja nem a folyamatokat listázza ki, hanem a folyamatokat reprezentáló objektumokat.

A használatához lásd a Sort példaprogramot.

get-member

Ahhoz, hogy tudjuk, hogy egy objektummal mit tudunk kezdeni, tudnunk kell, hogy az objektum publikus interfésze milyen műveleteket tartalmaz, milyen szolgáltatásokat nyújt. Ennek a kérdésnek a megválaszolásában segít a "get-member" utasítás:

PS> get-process | get-member
get-psdrive

A get-psdrive segítségével megkérdezhetjük a PowerShellt, hogy milyen adatforrások elérhetőek. Nemcsak a fájlrendszer érhető el, hanem megfelelő jogosultásot feltételezve a registry és a certificate-ek is.

Ezek elérése hasonlóképpen történik, mintha a fájlrendszerben lépkednénk, vagyis a cd utasítás segítségével, viszont az elérési út végére egy kettőspontot kell tenni, mintha meghajtót váltanánk.

Ha például a HKEY_LOCAL_MACHINE-t szeretnénk elérni:

PS> cd HKLM:

A certificate-ek a "cert", a környezeti változók az "env", a PowerShell saját váltózói pedig a "variable" virtuális meghajtón találhatóak.

select

A "sort"-nál láthattuk, hogy a PowerShell automatikusan döntötte el, hogy az objektumok melyik property-jét listázta ki. Felmerülhet az igény, hogy ezt szeretnénk felüldefiniálni és mi akarjuk eldönteni, hogy mi kerüljön az output-ra. Ennek az eszköze a "select", a szintaxisa SQL szerű a könnyebb használat érdekében.

Például ha ki akarjuk listázni a futó folyamatok nevét és mellé azt, hogy mennyi memóriát allokált magának:

PS> get-process | select name, privatememorysize

A select-hez található egy bonyolultabb példaprogram is a példaprogramok között.

Hasznos kapcsolók (WhatIf, Confirm)

What-if

A WhatIf kapcsoló segítségével a PowerShell megmutatja, hogy az adott utasításnak mi lenne a hatása:

PS C:\Users\Administrator> get-Childitem c:\ -include *.txt -recurse | remove-Item -whatIf What if: Performing operation "Remove File" on Target "C:\data.txt". What if: Performing operation "Remove File" on Target "C:\moredata.txt"
Confirm

A confirm kapcsolóval a felhasználó dönthet arról, hogy engedélyezi-e az adott utasítás végrehajtását vagy sem:

PS C:\Users\Administrator> get-Childitem c:\ -include *.txt -recurse | remove-Item -confirm

A lehetséges válaszok:

Alias

Vegyük észre, hogy a sort és a dir (és még jópár utasítás), amelyek erőforrásokat érnek el, nem "ige"-"főnév" alakúak.

A Microsoft fejlesztői észrevették, hogy a fejlesztők nagy része nem szeret feleslegesen gépelni, ezért (illetve az utasítások elnevezési konvenciójának fenntartása miatt) vezették be az alias-okat.

A PowerShell rendelkezik néhány beépített alias-al, mint például a "gps" ami a "get-process" szinonímája.

Azt, hogy milyen alias-ok vannak beállítva, a "get-alias" utasítás segítségével nézhetük meg:

PS> get-alias

Amennyiben nem vagyunk kiváncsiak az összes alias-ra, természetesen megadhatunk szűrőfeltételként reguláris kifejezést:

PS> get-alias g*

Az alias-ok elnevezésének néhány konvenciója:

Az alias-ok menedzseléséért felelős utasításokat megkaphatjuk a get-command segítségével:

PS> get-command *alias

Értékadás, üres utasítás

Változóknak adhatunk utasítást az értékadó operátorok használatával, illetve a "set-variable váltózónév -value érték" cmdlet segítségével. Az utasításokat egy pontosvesszővel zárhatjuk le, amennyiben egy sorban csak egy utasítás szerepel, a pontosvessző elhagyható.

Üres utasítást pedig így adhatunk meg: ; ;

Vezérlési szerkezetek

Szekvencia

Szekvenciát úgy hozhatunk létre, hogy az elemeit pontosvesszővel elválasztjuk.

Elágazás

Elágazás szempontjából a PowerShellben semmilyen újdonság nincs, megtalálhatóak a if, elseif, else kulcsszavak.

$File = get-Help about_if if ($File -match "The if Statement") { "We have the correct help file" } else { "Something is wrong, help file is corrupt" }

Ciklus

While ciklus

A PowerShellben a más programozási nyelvekben megszokott szintaxisnak megfelelően szerepel a while ciklus:

$i = 7 while ($i -le 85) { $i; $i +=7}
Do-while ciklus

A PowerShellben a más programozási nyelvekben megszokott szintaxisnak megfelelően szerepel a do-while ciklus:

$i = 7; do { $i; $i +=7 } while ($i -le 85)
Foreach ciklus

A PowerShellben a más programozási nyelvekben megszokott szintaxisnak megfelelően szerepel a foreach while ciklus:

$NumArray = (1,2,3,4,5,6,7,8,9,10,11,12) foreach ($number in $numArray ) { $number * 42}

A leginkább funkcionális nyelvekre jellemző sorozatfelsorolási szintaxis is használható PowerShellben:

$NumArray = (1..12) foreach ($number in $numArray ) { $number * 42}

Természetesen a bejárásban részt vevő collection-t a foreach-ben is deklarálhatjuk:

foreach ($number in 1..12 ) { $number * 42}
For ciklus

A PowerShellben a más programozási nyelvekben megszokott szintaxisnak megfelelően szerepel a for ciklus:

for ( $i = 42; $i -le 84; $i+=5 ) { $i }
Loop pipeline trükk

Jól bemutatható a nyelv kifejező ereje az alábbi példán: egy ciklus (pl.: foreach) kimenetét szeretnénk pipeline-nal továbbítani, a ciklus magjában pedig valamiféle manipulációt végzünk az elemeken (a példában megszorozzuk őket 7-tel). Először az alábbi megoldás juthat egy eszünkbe:

$NumArray = (1..12) $(foreach ($number in $numArray ) { $number * 7}) | set-variable 7x $7x

Ez a kód elég hosszú, nem túl jól olvasható és nem is igazán fejezi ki a szándékunkat.

Második nekifutásra sikerül rövidebbé és kifejezőbbé tennünk a kódunkat:

$NumArray = (1..12) $7x = @() foreach ($number in $numArray ) { $7x+=$number * 7} $7x

A legszebb megoldást pedig úgy kapjuk, hogy a foreach helyett % jelet használunk:

$7x = 1..12 |% {$_ * 7 } $7x

Vezérlésátadó utasítások

A PowerShell rendelkezik a más programozási nyelvekben megismert break és continue utasításokkal:

for ($i = 1; $i -lt 11; $i++) { if ($i % 2) { continue; } "i = $i" }

A break alapértelmezés szerint az a ciklust szakítja meg, amelyben meghívjuk, amennyiben ez egy beágyazott ciklus, a külső, befoglaló ciklust nem szakítja meg. Amennyiben mégis ezt szeretnénk, az alábbi megoldást kínálja a PowerShell:

outerLoop: for ($i = 0; $i -lt 100; $i++) { "i = $i" for ($j = 0; $j -lt 10; $j++) { if ($j -eq 5) { break outerLoop } "j = $j" } }