Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Historicky byly nástroje příkazového řádku v unixových systémech vyvinuty lépe než v systému Windows, ale s příchodem nového řešení se situace změnila.

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Pro PowerShell lze psát skripty v interpretovaném multiparadigmatickém jazyce, který obsahuje prvky klasického procedurálního, objektově orientovaného a dokonce i funkcionálního programování: podmínkový přechod, cykly, proměnné, pole, hash tabulky, třídy, zpracování chyb, stejně jako funkce, cmdlety a potrubí. Předchozí článek byla věnována základům práce v prostředí, a nyní nabízíme pozornosti čtenářů malý průvodce pro programátory.

Obsah:

Komentáře
Proměnné a jejich typy
Systémové proměnné
Oblasti viditelnosti
Proměnné prostředí
Aritmetické operátory a porovnávací operátory
Přiřazovací operátory
Logické operátory
Podmínkový přechod
Cyklus
Pole
Hash tabulky
Funkce
Zpracování chyb

Kód lze psát v jakémkoli textovém editoru nebo pomocí integrovaného vývojového prostředí - nejjednodušší je použít Windows PowerShell ISE z dodávky serverových operačních systémů Microsoft. To je potřeba pouze pro dostatečně složité skripty: krátké příkazy je snadnější provádět v interaktivním režimu.

Komentáře

Používání komentářů se považuje za součást dobrého stylu programování spolu s správnými odsazeními a mezerami:

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

<# 

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

#>

Proměnné a jejich typy

Proměnné v PowerShell jsou pojmenované objekty. Jejich názvy mohou obsahovat podtržítko, stejně jako písmena a číslice. Před názvem se vždy používá symbol $, a k deklaraci proměnné stačí specifikovat interpretátorovi platný název:

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Pro inicializaci proměnné (přiřazení jí hodnoty) se používá přiřazovací operátor (symbol =):

$test = 100

Proměnnou lze deklarovat s uvedením jejího typu v hranatých závorkách (operátor přetypování) před názvem nebo hodnotou:

[int]$test = 100

$test = [int]100

Je důležité chápat, že proměnné v PowerShell jsou plnohodnotné objekty (třídy) se svými vlastnostmi a metodami, jejichž typy jsou založeny na již existujících v .NET Core. Uveďme hlavní:

Typ (třída .NET)

Popis

Příklad kódu

[string]
System.String

Unicode řetězec 

$test = "test"
$test = ‘test’

[char]
System.Char

Unicode znak (16 bitů)

[char]$test = ‘c’

[bool]
System.Boolean

logický typ (pravda nebo nepravda)

[bool]$test = $true

[int]
System.Int32

třicetidvoubitové celé číslo (32 bitů)

[int]$test = 123456789

[long]
System.Int64

šedesát čtyřbitové celé číslo (64 bitů)

[long]$test = 12345678910

[single]
System.Single

číslo s plovoucí desetinnou čárkou délky 32 bitů

[single]$test = 12345.6789

[double]
System.Double

číslo s plovoucí desetinnou čárkou o délce 64 bitů (8 bajtů)

[double]$test = 123456789.101112

[decimal]
System.Decimal

číslo s plovoucí desetinnou čárkou o délce 128 bitů (musí mít d na konci)

[decimal]$test = 12345.6789d

[DateTime]
System.DateTime

datum a čas 

$test = Get-Date

[array]
System.Object[]

pole, jehož index prvků začíná na 0

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

[hashtable]
System.Collections.Hashtable

hashovací tabulky — asociativní pole s pojmenovanými klíči, postavené na principu: @{klíč = "hodnota"}

$test_hashtable = @{one="jeden"; two="dva"; three="tři"}

PowerShell podporuje implicitní převod typů, navíc může typ proměnné během běhu měnit (například pomocí přiřazovacího operatoru), pokud není uveden explicitně — v takovém případě interpretr vrátí chybu. Typ proměnné z předchozího příkladu lze určit pomocí volání metody GetType():

$test.GetType().FullName

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Existuje určité množství cmdletů pro správu proměnných. Jejich seznam v přehledné formě je možné vypsat pomocí příkazu:

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

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Pro prohlížení deklarovaných proměnných a jejich hodnot můžete použít speciální cmdlet:

Get-Variable | more

Tento způsob se zdá být poněkud zbytečně složitý, s proměnnými je mnohem pohodlnější pracovat přes operátory nebo přístupem k jejich vlastnostem a metodám přímo. Nicméně cmdlety mají právo na existenci, protože umožňují nastavit některé další parametry. Je důležité pochopit, že uživatelské proměnné jsou definovány pouze v rámci aktuální relace. Po uzavření konzole nebo dokončení skriptu jsou odstraněny.

Systémové proměnné

Kromě uživatelských proměnných existují vestavěné (systémové) proměnné, které se po skončení aktuální relace neodstraňují. Dělí se na dva typy, přičemž data o stavu PowerShell jsou uchována v automatických proměnných, kterým nelze přiřadit libovolné hodnoty. K nim patří například $PWD:

$PWD.Path

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Pro ukládání uživatelských nastavení jsou potřebné proměnné preferencí, jejichž hodnoty lze měnit. Například pomocí $ErrorActionPreference se určuje reakce interpretru příkazů na vznik nerelevantních chyb.

Kromě operátorů a příkazů pro práci s deklarovanými proměnnými existuje pseudo-úložiště Variable:. Můžete s ním pracovat analogicky k jiným úložištím, přičemž proměnné v tomto případě připomínají objekty souborového systému:

Get-ChildItem Variable: | more

nebo

ls Variable: | more

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Oblasti viditelnosti

Pro proměnné v PowerShellu existuje pojem rozsah (Scope). Akce globálního rozsahu (Global) se vztahuje na celou aktuální relaci — zahrnuje například systémové proměnné. Místní (Local) proměnné jsou dostupné pouze v oblasti, kde byly definovány: například uvnitř funkce. Existuje také pojem rozsahu skriptu (Script), ale pro příkazy skriptu je v podstatě místní. Ve výchozím nastavení při deklaraci proměnných mají přiřazen lokální rozsah, a abyste to změnili, potřebujete speciální konstrukci ve tvaru: $Global: proměnná = hodnota.

Například takto:

$Global:test = 100

Proměnné prostředí

Z PowerShellu je dostupné ještě jedno pseudo-úložiště Env:, pomocí kterého můžete přistupovat k proměnným prostředí. Při spuštění shellu se kopírují z nadřazeného procesu (tj. z programu, který inicioval aktuální relaci) a obvykle se jejich počáteční hodnoty shodují s hodnotami v ovládacím panelu. Pro prohlížení proměnných prostředí se používá příkaz Get-ChildItem nebo jeho pseudonymy (aliasy): ls a dir.

dir Env:

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Tyto proměnné představují sekvence bytů (nebo znaků, pokud chcete), jejichž interpretace závisí pouze na programu, který je používá. Příkazy *-Variable nefungují s proměnnými prostředí. Abyste k nim mohli přistupovat, budete muset použít prefix disku:

$env:TEST = "Hello, World!"

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Aritmetické operátory a porovnávací operátory

V PowerShell existují následující aritmetické operátory: + (sčítání), — (odčítání), * (násobení), / (dělení) a % (modulo nebo zbytek po dělení). Výsledek aritmetického výrazu se počítá zleva doprava podle obvyklého pořadí operací, a pro seskupování částí výrazu se používají kulaté závorky. Mezery mezi operátory se ignorují, používají se pouze pro usnadnění čitelnosti. Operátor + také spojuje, a operátor * opakuje řetězce. Při pokusu o sečtení čísla s řetězcem se číslo převede na řetězec. Kromě toho má jazyk PowerShell mnoho porovnávacích operátorů, které kontrolují shodu mezi dvěma hodnotami a vracejí logické True nebo False:

Operator

Popis

Příklad kódu

-eq

Rovná se / Equal (ekvivalent = nebo == v jiných jazycích)

$test = 100
$test -eq 123 

-ne

Není rovno / Not equal (ekvivalent nebo !=)

$test = 100
$test -ne 123   

-gt

Větší než / Greater than (ekvivalent >)

$test = 100
$test -gt 123

-ge

Větší než nebo rovno / Greater than or equal (ekvivalent >=)

$test = 100
$test -ge 123

-lt

Menší než / Less than (ekvivalent <)

$test = 100
$test -lt 123  

-le

Menší než nebo rovno / Less than or equal (ekvivalent <=)

$test = 100
$test -le 123

Existují i další podobné operátory, které například umožňují srovnávat řetězce se zohledněním zástupného znaku nebo používat regulární výrazy k hledání shody. Tyto operátory podrobně prozkoumáme v následujících článcích. Symboly a = pro srovnání se nepoužívají, protože jsou vyhrazeny pro jiné účely.

Přiřazovací operátory

Kromě nejběžnějšího operátoru = existují také další operátory přiřazení: +=, -=, *=, /= a %= . Tyto operátory mění hodnotu před přiřazením. Podobně se chovají unární operátory ++ a —, které zvyšují nebo snižují hodnotu proměnné — také spadají mezi operátory přiřazení.

Logické operátory

Pro popis složitých podmínek samotné srovnání nestačí. Jakékoli logické výrazy lze zapsat pomocí operátorů: -and, -or, -xor, -not a!… Fungují podobně jako v jiných programovacích jazycích, přičemž lze používat kulaté závorky pro určení pořadí výpočtů:

("Test" -eq "Test") -and (100 -eq 100)

-not (123 -gt 321) 

!(123 -gt 321)

Podmínkový přechod

Ovládací struktury v PowerShellu jsou standardní: IF(IF…ELSE, IF…ELSEIF…ELSE) a SWITCH. Podívejme se na jejich použití na příkladech:

[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 nebo hodnota není definována"}
}

Cyklus

V PowerShellu existuje několik typů cyklů: WHILE, DO WHILE, DO UNTIL, FOR a FOREACH.

Podmínkový cyklus funguje, pokud/to platí:

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

Cykly s post-podmínkou se provádějí alespoň jednou, protože kontrola podmínky probíhá po vykonání iterace. Přičemž DO WHILE funguje, dokud je podmínka pravdivá, a DO UNTIL — dokud je nepravdivá:

[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)

Počet iterací cyklu FOR je znám předem:

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

V cyklu FOREACH se provádí procházení prvků pole nebo kolekce (hash tabulky):

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

Pole

V proměnných PowerShell jsou uchovávány nejen jednotlivé objekty (číslo, řetězec atd.), ale i vícenásobné. Nejjednodušší formou takových proměnných jsou pole. Pole může obsahovat několik prvků, jeden prvek nebo být prázdné, tj. neobsahovat prvky. Pro jeho deklaraci se používá operátor @(), který budeme potřebovat v následujícím článku — je velmi důležitý pro přidávání do pole dalších polí (vytváření vícerozměrných polí), předávání polí do funkcí jako argumentu a podobné úkoly:

$test_array = @() #vytvoření prázdného pole

Při inicializaci pole se jeho hodnoty vyjmenovávají čárkou (speciální operátor ,):

$test_array = @(1, 2, 3, 4) # vytváříme pole ze čtyř prvků 

Ve většině případů lze operátor @() vynechat:

$test_array = 1, 2, 3, 4

V tomto případě je pole jednoho prvku inicializováno následujícím způsobem

$test_array = , 1

Pro přístup k prvkům pole se používá celočíselný index začínající od nuly a operátor indexu (hranaté závorky):

$test_array[0] = 1

Můžete uvést několik indexů čárkou, včetně opakujících se:

$test_array = "jedna", "dva", "tři", "čtyři"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0]

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Operator .. (dva body — operátor rozsahu) vrací pole celých čísel v určeném horním a dolním limitu intervalového úseku. Například výraz 1..4 vrací pole se čtyřmi prvky @(1, 2, 3, 4), zatímco výraz 8..5 — pole @(8, 7, 6, 5).

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Pomocí operátoru rozsahu lze inicializovat pole ($test_array = 1..4) nebo získat výřez (slice), tj. sekvenci prvků jednoho pole s indexy z jiného. Přitom záporné číslo -1 označuje poslední prvek pole, -2 — předposlední atd.

$test_array = "jeden", "dva", "tři", "čtyři"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]

Všimněte si, že hodnoty celého čísla v poli mohou být větší než maximální hodnota indexu pole s daty. V tomto případě jsou vráceny všechny hodnoty až do posledního:

$test_array[0..100]

Pokud se pokusíte přistoupit k jedinému neexistujícímu prvku pole, vrátí se hodnota $null.

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

V PowerShell mohou pole obsahovat prvky různých typů nebo být přísně typizována:

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

Kde vlastnost $test_array.count — počet prvků pole.

Příklad vytvoření přísně typizovaného pole:

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

Hash tabulky

Další základní typ proměnných v jazyce PowerShell — hash-tabulky, které se také nazývají asociativní pole. Hashtable jsou podobné JSON objektům a vytvářejí se na základě klíč-hodnota. Na rozdíl od běžných polí je přístup k jejich prvkům realizován prostřednictvím pojmenovaných klíčů, které jsou vlastnostmi objektu (také lze použít indexový operátor — hranaté závorky).

Prázdná hash-tabulka se deklaruje pomocí speciálního symbolu @ a operatorových závorek:

$test_hashtable = @{}

Při deklaraci je možné okamžitě vytvořit klíče a přiřadit jim hodnoty:

$test_hashtable = @{one="jeden"; two="dva"; three="tři"; "nějaký klíč"="nějaká hodnota"}

Pro přidání prvku do hash-tabulky je třeba přiřadit jiný neexistující klíč nebo použít metodu Add(). Pokud se přiřazení provádí se stávajícím klíčem, jeho hodnota se změní. Pro odstranění prvku z hash-tabulky se používá metoda Remove().

$test_hashtable."nějaký klíč"
$test_hashtable["nějaký klíč"]
$test_hashtable.Add("čtyři", "čtyři")
$test_hashtable.five = "pět"
$test_hashtable['five'] = "nahrazujeme hodnotu"
$test_hashtable.Remove("one")

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Proměnné tohoto typu lze předávat jako argumenty funkcím a cmdletům — v následujícím článku prozkoumáme, jak se to dělá, a také se podíváme na další podobný typ — PSCustomObject.

Funkce

V jazyce PowerShell jsou všechny potřebné prvky pro procedurální programování, včetně funkcí. K jejich popisu se používá klíčové slovo Function, po kterém je třeba uvést název funkce a skupinu příkazů uzavřenou v závorkách. Pokud je potřeba předat do funkce argumenty, lze je uvést hned za názvem v kulatých závorkách.

function název-funkce (argument1, ..., argumentN) 
{ 
        tělo-funkce 
} 

Funkce vždy vrací výsledek — je to pole výsledků všech jejích příkazů, pokud jich je více než jeden. Pokud je příkaz pouze jeden, vrací se jediná hodnota odpovídajícího typu. Konstrukce return $value přidává prvek se hodnotou $value do pole výsledků a přeruší vykonávání seznamu příkazů, zatímco prázdná funkce vrací $null.

Pro příklad vytvoříme funkci pro umocnění čísla na druhou:

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

Všimněte si, že v těle funkce lze používat jakékoli proměnné, které byly deklarovány před jejím zavoláním, a volání funkcí v PowerShellu může působit nezvykle: argumenty (pokud existují) nejsou uzavírány do kulatých závorek a jsou odděleny mezerami.

sqr 2

nebo takto:

sqr -number 2

Kvůli způsobu předávání argumentů je někdy potřebné obalit samotnou funkci do závorek:

function test_func ($n) {}
test_func -eq $null     # funkce nebyla volána
(test_func) -eq $null   # výsledek výrazu — $true

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Při popisu funkce lze argumentům přiřadit výchozí hodnoty:

function func ($arg = value) {
         #tělo funkce
}

Existuje také jiná syntaxe pro popis argumentů funkce, navíc mohou být parametry čteny z potrubí — to vše bude užitečné v příštím článku, kdy budeme zkoumat exportované moduly a vytváření vlastních cmdletů.

Zpracování chyb

V PowerShell existuje mechanismus Try…Catch…Finally, který umožňuje zpracovávat výjimkové situace. Do bloku Try se umisťuje kód, ve kterém může nastat chyba, a do bloku Catch se umisťuje jeho zpracovatel. Pokud k chybě nedojde, blok Catch se nevykonává. Blok Finally se vykonává po blaoku Try bez ohledu na to, zda došlo k chybě, a bloků Catch může být několik pro různé typy výjimek. Samotná výjimka se ukládá do proměnné bez nutnosti prohlášení ($_) a lze ji snadno vyextrahovat. V následujícím příkladu realizujeme ochranu před zadáním nesprávné hodnoty:

try {

        [int]$test = Read-Host "Zadejte číslo"
        100 / $test

} catch {

         Write-Warning "Nesprávné číslo"
         Write-Host $_

}

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Na tomto místě bychom měli ukončit přehled základů programování v PowerShellu. V následujících článcích se podrobněji podíváme na práci s proměnnými různých typů, sbírkami, regulárními výrazy, vytváření funkcí, modulů a vlastních cmdletů, stejně jako na objektově orientované programování.

Co je to Windows PowerShell a k čemu slouží? Část 2: úvod do programovacího jazyka

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster