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.
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í. 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:
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:

Pro inicializaci proměnné (přiřazení jí hodnoty) se používá přiřazovací operátor (symbol =):
$test = 100Promě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]100Je 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 
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 
Pro prohlížení deklarovaných proměnných a jejich hodnot můžete použít speciální cmdlet:
Get-Variable | moreTento 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 
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: | morenebo
ls Variable: | more 
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: 
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!" 
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 polePř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, 4V tomto případě je pole jednoho prvku inicializováno následujícím způsobem
$test_array = , 1Pro 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] = 1Můž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] 
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).

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.

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") 
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 2nebo takto:
sqr -number 2Kvů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 
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 $_
}

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í.
Zdroj: habr.com
