Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Történelmileg a parancssori segédprogramok a Unix rendszerekben jobban fejlődtek, mint Windows alatt, de az új megoldások megjelenésével a helyzet megváltozott.

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

A PowerShell esetében szkripteket egy értelmezett, több paradigma nyelven írhatunk, amely klasszikus eljáráselvű, objektum-orientált, sőt funkcionális programozási elemeket tartalmaz: feltételes ugrás, ciklusok, változók, tömbök, hash táblák, osztályok, hiba kezelés, valamint funkciók, parancsmódok és csövek. Előző cikk az alapvető munkafolyamatoknak volt szentelve, jelenleg pedig a programozók számára készült egy kis útmutató olvasóink figyelmébe.

Tartalomjegyzék:

Megjegyzések
Változók és típusaik
Rendszerváltozók
Látókörök
Környezeti változók
Aritmetikai operátorok és összehasonlító operátorok
Hozzárendelési operátorok
Logikai operátorok
Feltételes ugrás
Ciklusok
Tömbök
Hash táblák
Funkciók
Hibakezelés

A kódot bármilyen szövegszerkesztőben írhatjuk, vagy integrált fejlesztési környezet használatával — a legkönnyebb a Windows PowerShell ISE, amely a Microsoft kiszolgáló operációs rendszereinek csomagjában található. Ezt csak elég bonyolult szkriptekhez szükséges használni: rövid parancssorokat egyszerűbb interaktív módban végrehajtani.

Megjegyzések

A megjegyzések használata a jó programozási stílus részének számít a megfelelő behúzásokkal és szünetekkel együtt:

# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.

<# 

       Так обозначаются начало и конец блочного комментария. 
       Заключенный между ними текст интерпретатор игнорирует.

#>

Változók és típusaik

A PowerShell-ben a változók névvel ellátott objektumok. A neveik tartalmazhatnak aláhúzási jel, betűk és számok. A név előtt mindig $ szimbólum áll, és a változó deklarálásához elegendő, ha megadjuk a fordítónak egy érvényes nevet:

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

A változó inicializálásához (érték hozzárendeléséhez) a hozzárendelési operátort (az = szimbólumot) használjuk:

$test = 100

A változót meg lehet határozni a típusa megadásával szögletes zárójelek között (típus konvertáló operátor) a név vagy az érték előtt:

[int]$test = 100

$test = [int]100

Fontos megérteni, hogy a PowerShell-ben a változók teljes értékű objektumok (osztályok), amelyek tulajdonságokkal és metódusokkal rendelkeznek, és típusuk a .NET Core folytatása. A legfontosabbakat soroljuk fel:

Típus (.NET osztály)

Leírás

Példa kódra

[string]
System.String

Unicode karakterlánc 

$test = "teszt"
$test = 'teszt'

[char]
System.Char

Unicode karakter (16 bit)

[char]$test = 'c'

[bool]
System.Boolean

logikai típus (logikai érték True vagy False)

[bool]$test = $true

[int]
System.Int32

harminckét bites egész szám (32 bit)

[int]$test = 123456789

[long]
System.Int64

hatvannégy bites egész szám (64 bit)

[long]$test = 12345678910

[single]
System.Single

harminckét bites lebegőpontos szám

[single]$test = 12345.6789

[double]
System.Double

64 bites lebegőpontos szám (8 bájt)

[double]$test = 123456789.101112

[decimal]
System.Decimal

128 bites lebegőpontos szám (a végén kötelező a d megadása)

[decimal]$test = 12345.6789d

[DateTime]
System.DateTime

dátum és idő 

$test = Get-Date

[array]
System.Object[]

tömb, amelynek elemeinek indexe 0-ról indul

$test_array = 1, 2, "teszt", 3, 4

[hashtable]
System.Collections.Hashtable

hash táblák — asszociatív tömbök név szerinti kulcsokkal, amelyek a következő elv szerint épülnek fel: @{kulcs = "érték"}

$test_hashtable = @{one="egy"; two="kettő"; three="három"}

A PowerShell támogatja a típusok implicit konverzióját, továbbá a változó típusa menet közben is változhat (például a hozzárendelési operátor segítségével), ha nem van kötelezően megadva — ebben az esetben az interpreter hibaüzenetet ad. Az előző példa alapján a változó típusát a GetType() metódus meghívásával lehet meghatározni:

$test.GetType().FullName

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Vannak bizonyos parancsok a változók kezelésére. A lista könnyen áttekinthető formában a következő parancs segítségével érhető el:

Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

A deklarált változók és értékeik megtekintésére egy speciális parancsot használhatunk:

Get-Variable | more

Ez a módszer túlságosan körülményesnek tűnik, a változókkal sokkal kényelmesebb dolgozni operátorokkal vagy közvetlenül a tulajdonságaik és metódusaik elérésével. Mindazonáltal a parancsok létezésnek jogosultsága van, mivel megengedik bizonyos további paraméterek megadását. Fontos megérteni, hogy a felhasználói változók csak a jelenlegi munkamenet keretein belül vannak definiálva. A konzol bezárásával vagy a szkript végrehajtásával eltávolításra kerülnek.

Rendszerváltozók

A felhasználói által deklaráltakon kívül léteznek beépített (rendszerszintű) változók is, amelyek nem törlődnek a jelenlegi munkamenet befejezése után. Ezeket két típusra osztják, miközben a PowerShell állapotára vonatkozó adatok automatikus változókban tárolódnak, amelyeknek nem lehet önállóan tetszőleges értékeket rendelni. Ide tartozik például a $PWD:

$PWD.Path

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

A felhasználói beállítások tárolására preferenciaváltozók szükségesek, amelyek értékei módosíthatók. Például a $ErrorActionPreference segítségével állítható be az interpreter reakciója a nem kritikus hibák előfordulására.

A változók eléréséhez használt operátorok és parancsok mellett létezik a Variable: álnyugágy. Ezt a többi tárolóval analógiában lehet használni, a változók ebben az esetben a fájlrendszer objektumaira emlékeztetnek:

Get-ChildItem Variable: | more

vagy

ls Variable: | more

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Látókörök

A PowerShell-ben a változóknak hatáskör fogalmuk van. A globális hatáskör (Global) az aktuális munkamenetre terjed ki — ide tartoznak például a rendszerváltozók. A lokális (Local) változók csak abban a hatáskörben érhetők el, ahol definiálták őket: mondjuk egy funkción belül. Van egy szkript hatáskör (Script) fogalom is, de parancsok esetén lényegében lokálisnak számít. Alapértelmezés szerint a változók deklarálásakor lokális hatáskört kapnak, és ennek megváltoztatásához speciális szintaxis szükséges: $Global: változó = érték.

Például így:

$Global:test = 100

Környezeti változók

A PowerShell-ből egy másik álnyugágy is elérhető, az Env:, amely segítségével elérhetjük a környezeti változókat. Amikor az elemző elindul, ezek a szülő folytatásból (azaz a jelenlegi munkamenetet kezdeményező programból) másolódnak, és általában a kezdeti értékeik megegyeznek a vezérlőpult értékeivel. A környezeti változók megtekintéséhez a Get-ChildItem parancsot vagy annak álnév (alias) parancsait, mint az ls és dir, használják.

dir Env:

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Ezek a változók bájtok (vagy karakterek) sorozatai, melyek értelmezését csak az őket használó program határozza meg. Az *-Variable parancsok nem működnek a környezeti változókkal. Az elérésükhöz lemez előtagot kell használni:

$env:TEST = "Hello, World!"

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Aritmetikai operátorok és összehasonlító operátorok

A PowerShellben az alábbi aritmetikai operátorok találhatók: + (összeadás), — (kivonás), * (szorzás), / (osztás) és % (maradékos osztás). Az aritmetikai kifejezés eredménye balról jobbra a megszokott műveleti sorrend szerint számítódik ki, míg a kifejezés részeinek csoportosításához zárójeleket használnak. Az operátorok közötti szóközöket figyelmen kívül hagyják, azok csupán a könnyebb értelmezés érdekében vannak. A + operátor szövegeket is egyesít, a * operátor pedig megszorozza a szövegeket. Amikor egy számot próbálnak hozzáadni egy szöveghez, a szám átalakul szöveggé. Ezen kívül a PowerShell nyelvben számos összehasonlító operátor található, amelyek két érték közötti megfelelést ellenőriznek, és logikai True vagy False értéket adnak vissza:

Operátor

Leírás

Példa kódra

-eq

Egyenlő / Equals (analóg a = vagy == más nyelvekben)

$test = 100
$test -eq 123 

-ne

Nem egyenlő / Not equal (analóg vagy !=)

$test = 100
$test -ne 123   

-gt

Nagyobb mint / Greater than (analóg >)

$test = 100
$test -gt 123

-ge

Nagyobb vagy egyenlő / Greater than or equal (analóg >=)

$test = 100
$test -ge 123

-lt

Kisebb mint / Less than (analóg <)

$test = 100
$test -lt 123  

-le

Kisebb vagy egyenlő / Less than or equal (analóg <=)

$test = 100
$test -le 123

Más hasonló operátorok is léteznek, amelyek például lehetővé teszik a szövegek összehasonlítását helyettesítő karakterek figyelembevételével, vagy reguláris kifejezések használatával kereshetik a mintákhoz való illeszkedést. Ezeket a következő cikkekben részletesen megvizsgáljuk. A és = jeleket nem használják az összehasonlításra, mivel más célokra van szükség rájuk.

Hozzárendelési operátorok

A legelterjedtebb = operátor mellett léteznek más hozzárendelő operátorok is: +=, -=, *=, /= és %= . Ezek megváltoztatják az értéket a hozzárendelés előtt. Hasonlóan viselkednek az együttes operátorok ++ és —, amelyek növelik vagy csökkentik a változó értékét — ezek is hozzárendelő operátorok.

Logikai operátorok

Bonyolult feltételek leírásához a puszta összehasonlítás nem elegendő. Bármilyen logikai kifejezést a következő operátorok segítségével is fel lehet írni: -and, -or, -xor, -not és !... Ugyanúgy működnek, mint más programozási nyelvekben, és használhatók zárójelek a számítási sorrend megadására:

("Teszt" -eq "Teszt") -and (100 -eq 100)

-not (123 -gt 321) 

!(123 -gt 321)

Feltételes ugrás

A PowerShellben a feltételes elágazások szabványosak: IF(IF…ELSE, IF…ELSEIF…ELSE) és SWITCH. Vizsgáljuk meg használatukat példákon keresztül:

[int]$test = 100
if ($test -eq 100) {
      Write-Host "test = 100"
}



[int]$test = 50
if ($test -eq 100) {
       Write-Host "test = 100"
}
else {
      Write-Host "test  100"
}



[int]$test = 10
if ($test -eq 100) {
      Write-Host "test = 100"
}
elseif ($test -gt 100) {
      Write-Host "test > 100"
}
else {
       Write-Host "test  5 vagy az érték nincs meghatározva"}
}

Ciklusok

A PowerShell nyelvben többféle ciklus létezik: WHILE, DO WHILE, DO UNTIL, FOR és FOREACH.

A feltételes ciklus működik, ha/amíg ez teljesül:

[int]$test = 0
while ($test -lt 10) {
      Write-Host $test
      $test = $test + 1
}

A posztfeltételes ciklusok legalább egyszer végrehajtódnak, mert a feltétel ellenőrzése az iteráció végrehajtása után történik. A DO WHILE addig működik, amíg a feltétel igaz, míg a DO UNTIL az ellenkező esetben:

[int]$test = 0
do {
      Write-Host $test
      $test = $test + 1 
}
while ($test -lt 10)



[int]$test = 0
do {
      Write-Host $test
      $test = $test + 1 
}
until ($test -gt 9)

A FOR ciklus iterációinak száma előre ismert:

for ([int]$test = 0; $test -lt 10; $test++) {
       Write-Host $test
}

A FOREACH ciklus egy tömb vagy gyűjtemény (hash tábla) elemeit iterálja:

$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
        Write-Host $item
}

Tömbök

A PowerShell változók nemcsak egyedi objektumokat (mint például szám, szöveg, stb.) tárolnak, hanem többet is. A legbasicabb változattípusuk a tömbök. A tömb állhat több elemből, egyetlen elemből vagy lehet üres, azaz nem tartalmaz elemeket. Kinyilatkoztatásához az @() operátort használják, amely a következő cikkben nagyon fontos lesz, mivel szükség lesz más tömbök hozzáadására (többdimenziós tömbök létrehozásához), valamint tömbök átadására függvényeknek argumentumként és hasonló feladatokhoz:

$test_array = @() # üres tömb létrehozása

A tömb inicializálásakor az értékek vesszővel vannak felsorolva (speciális operátor, ,):

$test_array = @(1, 2, 3, 4) # négy elemű tömb létrehozása 

A legtöbb esetben az @() operátor elhagyható:

$test_array = 1, 2, 3, 4

Ebben az esetben az egy elemű tömb inicializálása a következőképpen történik

$test_array = , 1

A tömb elemeinek eléréséhez egy nulláról induló egész számú indexet és az indexelési operátort (szögletes zárójelek) használunk:

$test_array[0] = 1

Több indexet is meg lehet adni vízszintesen, beleértve az ismétlődő indexeket is:

$test_array = "egy", "kettő", "három", "négy"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0]

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Operátor .. (két pont — intervallum operátor) visszaad egy egész számokból álló tömböt egy adott felső és alsó határon belül. Például az 1..4 kifejezés egy négy elemből álló tömböt eredményez @(1, 2, 3, 4), míg a 8..5 kifejezés egy @(8, 7, 6, 5) tömböt ad vissza.

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Az intervallum operátor segítségével inicializálható egy tömb ($test_array = 1..4), vagy egy szelet (slice) kapható, azaz egy tömb egyes elemeinek sorrendje egy másik tömb indexei alapján. Ekkor a -1 negatív szám az utolsó tömb elemet, a -2 a péntelet követőt jelöli, és így tovább.

$test_array = "egy", "kettő", "három", "négy"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]

Vegye figyelembe, hogy az egész számokból álló tömb értékei lehetnek nagyobbak, mint a tömb maximális indexe. Ebben az esetben az utolsó elemig visszaadja az összes értéket:

$test_array[0..100]

Ha megpróbál hozzáférni egy nem létező tömb elemhez, akkor a $null értéket kapja.

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

A PowerShell-ben a tömbök tartalmazhatnak különböző típusú elemeket, vagy lehetnek szigorúan típusúak:

$test_array = 1, 2, "teszt", 3, 4
for ([int]$i = 0; $i -lt $test_array.count; $i++)
{
          Write-Host $test_array[$i]
}

Ahol a $test_array.count tulajdonság a tömb elemeinek számát jelenti.

Példa egy szigorúan típusú tömb létrehozására:

[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Hash táblák

A PowerShell nyelvben egy másik alapvető típus az hash-táblák, amelyeket asszociatív tömböknek is neveznek. A Hashtable hasonlít a JSON objektumhoz, és kulcs-érték elv szerint épül fel. A hagyományos tömböktől eltérően az elemekhez név szerinti kulcsokkal férünk hozzá, amelyek az objektum tulajdonságai (index operátor — négyzetes zárójelek is használhatók).

Egy üres hash-tábla a @ segédszimbólum és az operátoros zárójelek segítségével deklarálható:

$test_hashtable = @{}

Deklaráláskor azonnal létrehozhatók kulcsok és rendelhetők hozzájuk értékek:

$test_hashtable = @{one="egy"; two="kettő"; three="három"; "some key"="some value"}

Egy elem hozzáadásához a hash-táblához egy még nem létező kulcsot kell hozzárendelni, vagy az Add() metódust kell használni. Ha létező kulcshoz rendeljük, annak értéke megváltozik. Az elem eltávolítására a hash-táblából a Remove() metódus használható.

$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "négy")
$test_hashtable.five = "öt"
$test_hashtable['five'] = "érték cseréje"
$test_hashtable.Remove("one")

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Ezeket a típusú változókat át lehet adni funkcióknak és parancsnak - a következő cikkben megvizsgáljuk, hogyan működik ez, és foglalkozunk egy hasonló típussal is - PSCustomObject.

Funkciók

A PowerShell nyelv tartalmaz minden szükséges elemet a procedurális programozáshoz, beleértve a funkciókat is. A funkciók leírásához a Function kulcsszót használjuk, amelyet a funkció neve és a paraméterek zárójelek közé írott törzse követ.

function funkcio-nev (argument1, ..., argumentN) 
{ 
        funkcio-torzs 
} 

A funkció mindig visszaad egy eredményt - ez az összes állításának tömbje, ha több mint egy van. Ha csupán egy állítás van, akkor egyetlen értéket ad vissza a megfelelő típusban. A return $value szerkezet egy elemet ad hozzá az eredmények tömbjéhez, amelynek értéke $value, és megszakítja az utasítássorozat végrehajtását, míg egy üres funkció $null-t ad vissza.

Például hozzunk létre egy funkciót, amely egy szám négyzetre emelését végzi:

function sqr ($szam)
{
      return $szam * $szam
}

Megjegyezzük, hogy a funkció törzsében bármilyen, a hívás előtt deklarált változót használhatunk, és a PowerShell funkcióinak hívása szokatlannak tűnhet: az argumentumok (ha vannak) nem zárójelek között, hanem szóközökkel elválasztva kerülnek megadásra.

sqr 2

vagy így:

sqr -szam 2

Az argumentumok átadásának módja miatt néha magát a funkciót is zárójelek közé kell tenni:

function test_func ($n) {}
test_func -eq $null     # a funkció nem volt meghívva
(test_func) -eq $null   # a kifejezés eredménye - $true

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

A funkció leírása során alapértelmezett értékeket is rendelhetünk az argumentumokhoz:

function func ($arg = value) {
         #funkcio-torzs
}

Van egy másik szintaxis is a funkcióargumentumok leírására, ráadásul a paraméterek olvashatók a csővezetékből is - mindez hasznos lesz a következő cikkben, amikor az exportálási modulokat és a saját parancsok létrehozását vizsgáljuk.

Hibakezelés

A PowerShellben létezik a Try…Catch…Finally mechanizmus, amely lehetővé teszi a kivételi helyzetek kezelését. A Try blokkba kerül az a kód, amelyben hiba merülhet fel, míg a Catch blokk az annak kezelője. Ha nem történt hiba, a Catch blokk nem hajtódik végre. A Finally blokk mindig végrehajtódik a Try blokk után, függetlenül attól, hogy történt-e hiba, és több Catch blokk is létezhet különböző típusú kivételekhez. Maga a kivétel egy előzetesen deklarálás nélküli változóba ($_) kerül, és könnyen kinyerhető. Az alábbi példában a nem megfelelő érték bevitelének védelmét valósítjuk meg:

try {

        [int]$test = Read-Host "Kérem, írjon be egy számot"
        100 / $test

} catch {

         Write-Warning "Hibás szám"
         Write-Host $_

}

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Ezen a ponton befejeződik a PowerShell programozás alapjainak bemutatása. A következő cikkekben részletesebben megvizsgáljuk a különböző típusú változók kezelését, a gyűjteményeket, a reguláris kifejezéseket, a funkciók, modulok és saját parancskészletek létrehozását, valamint az objektumorientált programozást.

Mi az a Windows PowerShell és mivel lehet használni? 2. rész: Bevezetés a programozási nyelvbe

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster