Storikament, l-utilitajiet tal-linja tal-kmand fuq sistemi Unix huma żviluppati aħjar milli fuq Windows, iżda bil-miġja ta 'soluzzjoni ġdida, is-sitwazzjoni inbidlet.
PowerShell jippermettilek tikteb skripts f'lingwa interpretata u multi-paradigma li fiha elementi ta' programmazzjoni proċedurali klassika, orjentata lejn l-oġġetti, u anke funzjonali: fergħa kondizzjonali, loops, varjabbli, arrays, hash tables, klassijiet, ġestjoni ta' żbalji, kif ukoll funzjonijiet, cmdlets, u pipelines . kien iddedikat għall-baŜi tax-xogħol fl-ambjent, u issa noffru lill-qarrejja tagħna ktieb ta 'referenza żgħir għall-programmaturi.
Werrej:
Tista 'tikteb kodiċi fi kwalunkwe editur ta' test jew tuża ambjent ta 'żvilupp integrat - l-eħfef mod huwa li tieħu Windows PowerShell ISE li jiġi ma' sistemi operattivi ta 'server Microsoft. Dan huwa meħtieġ biss għal skripts pjuttost kumplessi: settijiet qosra ta 'kmandi huma aktar faċli biex jiġu eżegwiti b'mod interattiv.
Kummenti
L-użu tal-kummenti huwa meqjus bħala parti minn stil ta' programmar tajjeb, flimkien ma' indentazzjoni xierqa u spazju abjad:
# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.
<#
Так обозначаются начало и конец блочного комментария.
Заключенный между ними текст интерпретатор игнорирует.
#>
Varjabbli u t-tipi tagħhom
Varjabbli f'PowerShell huma oġġetti msemmija. L-ismijiet tagħhom jistgħu jinkludu l-karattru ta' underscore, kif ukoll ittri u numri. L-isem huwa dejjem preċedut minn simbolu $, u biex tiddikjara varjabbli, għandek bżonn biss li tipprovdi lill-interpretu b'isem validu:

Biex inizjalizza varjabbli (assenja valur għaliha), uża l-operatur tal-assenjazzjoni (is-simbolu =):
$test = 100Tista' tiddikjara varjabbli billi tindika t-tip tagħha f'parentesi kwadri (operatur tat-tip cast) qabel l-isem jew il-valur:
[int]$test = 100
$test = [int]100Huwa importanti li wieħed jifhem li l-varjabbli f'PowerShell huma oġġetti (klassijiet) sħaħ bi proprjetajiet u metodi, li t-tipi tagħhom huma bbażati fuq dawk misjuba f'.NET Core. Ejja elenka dawk ewlenin:
Tip (klassi .NET)
Deskrizzjoni
Eżempju tal-Kodiċi
[sekwenza] Sistema.SekwenzaSekwenza Unicode
$test = "test"
$test = 'test'
Karattru Unicode (16-il bit)
[kar]$test = 'c' [bool] Sistema.Booleantip boolean (valur boolean Veru jew Falz)
[bool]$test = $true [int] System.Int32tnejn u tletin bit numru sħiħ (32 bit)
[int]$test = 123456789 [twil] System.Int64erbgħa u sittin bit numru sħiħ (64 bit)
[twil]$test = 12345678910 [single] Sistema.Singlenumru floating point 32 bit twil
[single]$test = 12345.6789 [double] System.Doublenumru floating point twil 64 bit (8 bytes)
[doppju]$test = 123456789.101112 [deċimali] Sistema.Deċimalinumru floating point twil 128 bit (għandu jinkludi d fl-aħħar)
[deċimali]$test = 12345.6789d [DataĦin] Sistema.DataĦindata u ħin
$test = Get-Date
[array]Sistema.Oġġett[]firxa li l-indiċi tal-element tagħha jibda minn 0
$test_array = 1, 2, "test", 3, 4
[hashtable] Sistema.Kollezzjonijiet.HashtableIt-tabelli tal-hash huma arrays assoċjattivi b'ċwievet imsemmija, mibnija skond il-prinċipju: @{key = "valur"}
$test_hashtable = @{one="one"; tnejn="żewġ"; tlieta="tlieta"}
PowerShell jappoġġja konverżjoni tat-tip impliċita, u t-tip ta 'varjabbli jista' jinbidel fuq il-fly (per eżempju, bl-użu ta 'operatur ta' assenjazzjoni) sakemm ma jkunx sfurzat, f'liema każ l-interpretu se jarmi żball. Tista 'tiddetermina t-tip tal-varjabbli mill-eżempju preċedenti billi ssejjaħ il-metodu GetType():
$test.GetType().FullName 
Hemm numru ta' cmdlets għall-ġestjoni tal-varjabbli. Lista minnhom f'forma konvenjenti tintwera bl-użu tal-kmand:
Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap 
Biex tara l-varjabbli ddikjarati u l-valuri tagħhom, tista' tuża cmdlet speċjali:
Get-Variable | moreDan il-metodu jidher ikkumplikat żżejjed; huwa ħafna aktar konvenjenti li taħdem ma 'varjabbli permezz ta' operaturi jew billi taċċessa l-proprjetajiet u l-metodi tagħhom direttament. Madankollu, is-cmdlets għandhom posthom għaliex jippermettulek li tissettja xi parametri addizzjonali. Huwa importanti li wieħed jifhem li l-varjabbli tal-utent huma definiti biss fis-sessjoni attwali. Ladarba l-console tingħalaq jew l-iskript jitlesta, jitħassru.
Varjabbli tas-sistema
Minbarra dawk iddikjarati mill-utent, hemm varjabbli integrati (sistema) li ma jitħassrux wara li tintemm is-sessjoni attwali. Huma maqsuma f'żewġ tipi, b'dejta tal-istat PowerShell maħżuna f'varjabbli awtomatiċi li ma jistgħux jiġu assenjati valuri arbitrarji. Dawn jinkludu, pereżempju, $PWD:
$PWD.Path 
Biex taħżen il-preferenzi tal-utent, huma meħtieġa varjabbli tal-preferenza li l-valuri tagħhom jistgħu jinbidlu. Pereżempju, billi tuża $ErrorActionPreference tista' tissettja r-reazzjoni tal-interpretu tal-kmand għal żbalji mhux kritiċi.
Minbarra l-operaturi u ċ-cmdlets għall-aċċess għall-varjabbli ddikjarati, hemm il-Varjabbli: psewdo-akkumulatur. Tista 'taħdem magħha b'analoġija ma' drives oħra, u l-varjabbli f'dan il-każ jixbħu oġġetti tas-sistema tal-fajls:
Get-ChildItem Variable: | morejew
ls Variable: | more 
Ambitu
Varjabbli f'PowerShell għandhom kunċett imsejjaħ Scope. L-ambitu globali japplika għas-sessjoni attwali kollha - jinkludi, pereżempju, varjabbli tas-sistema. Il-varjabbli lokali huma disponibbli biss fl-ambitu fejn ġew definiti: ngħidu aħna, ġewwa funzjoni. Hemm ukoll il-kunċett tal-ambitu tal-iskript (Script), iżda għall-kmandi tal-iskript huwa essenzjalment lokali. B'mod awtomatiku, meta tiddikjara varjabbli, jingħataw ambitu lokali, u biex tbiddel dan, għandek bżonn kostruzzjoni speċjali bħal: $Global: varjabbli = valur.
Per eżempju, bħal dan:
$Global:test = 100
Varjabbli ambjentali
Hemm psewdo-drive ieħor disponibbli minn PowerShell, Env:, li tista 'tuża biex taċċessa varjabbli ambjentali. Meta tibda l-qoxra, huma kkupjati mill-proċess ġenitur (jiġifieri, mill-programm li beda s-sessjoni attwali) u normalment il-valuri inizjali tagħhom jaqblu mal-valuri fil-pannell tal-kontroll. Biex tara l-varjabbli tal-ambjent, uża l-cmdlet Get-ChildItem jew il-psewdonimi tiegħu: ls u dir.
dir Env: 
Dawn il-varjabbli huma sekwenzi ta 'bytes (jew karattri, jekk tippreferi), li l-interpretazzjoni tagħhom tiddependi biss fuq il-programm li jużahom. *-Cmdlets varjabbli b'varjabbli ambjentali ma jaħdmux. Biex tirreferi għalihom, ser ikollok tuża l-prefiss tad-diska:
$env:TEST = "Hello, World!" 
Operaturi tal-Aritmetika u tat-Tqabbil
PowerShell għandu l-operaturi aritmetiċi li ġejjin: + (addizzjoni), - (tnaqqis), * (multiplikazzjoni), / (diviżjoni), u % (modulo jew bqija tad-diviżjoni). Ir-riżultat ta' espressjoni aritmetika jiġi evalwat mix-xellug għal-lemin skont l-ordni tal-operazzjonijiet ġeneralment aċċettata, u l-parentesi jintużaw biex jiġbru l-partijiet tal-espressjoni. L-ispazji bejn l-operaturi huma injorati u jintużaw biss biex jagħmlu l-affarijiet aktar faċli biex jinqraw. L-operatur + jikkonkatena wkoll, u l-operatur * jirrepeti kordi. Jekk tipprova żżid numru ma 'sekwenza, din tiġi kkonvertita f'sekwenza. Barra minn hekk, PowerShell għandu ħafna operaturi ta 'tqabbil li jqabblu żewġ valuri u jirritorna Boolean Veru jew Falz:
Operatur
Deskrizzjoni
Eżempju tal-Kodiċi
-eq
Ugwali / Ugwali (analogu għal = jew == f'lingwi oħra)
$test = 100
$test -eq 123
- huwa
Mhux ugwali / Mhux ugwali (analogu għal <> jew !=)
$test = 100
$test -ne 123
-gt
Ikbar minn / Aktar (analogu>)
$test = 100
$test -gt 123
-ge
Ikbar minn jew ugwali / Akbar minn jew ugwali (analogu >=)
$test = 100
$test -ge 123
-lt
Inqas minn/Inqas (analogu <)
$test = 100
$test -lt 123
-il-
Inqas minn jew ugwali / Inqas minn jew ugwali (analogu <=)
$test = 100
$test -le 123
Hemm operaturi simili oħra li jippermettulek, pereżempju, tqabbel kordi bl-użu ta 'wildcards jew tuża espressjonijiet regolari biex tqabbel mudell. Aħna se nħarsu lejhom fid-dettall fl-artikoli li ġejjin. Is-simboli <, > u = ma jintużawx għal tqabbil minħabba li jintużaw għal skopijiet oħra.
Operaturi ta' Assenjament
Minbarra l-operatur l-aktar komuni =, hemm operaturi oħra ta’ assenjazzjoni: +=, -=, *=, /=, u %=. Huma jibdlu l-valur qabel l-assenjazzjoni. L-operaturi unarji ++ u -, li jżidu jew inaqqsu l-valur ta 'varjabbli, jaġixxu bl-istess mod - huma wkoll jappartjenu għal operaturi ta' assenjazzjoni.
Operaturi loġiċi
It-tqabbil waħdu mhuwiex biżżejjed biex jiddeskrivi kundizzjonijiet kumplessi. Tista' tikteb kwalunkwe espressjoni loġika billi tuża l-operaturi: -and, -or, -xor, -not and!.. Jaħdmu bħal f'lingwi ta' programmar oħra, iżda tista' tuża l-parentesi biex tispeċifika l-ordni tal-kalkolu:
("Тест" -eq "Тест") -and (100 -eq 100)
-not (123 -gt 321)
!(123 -gt 321)
Qabża kondizzjonali
L-operaturi tal-fergħat f'PowerShell huma standard: IF(IF...ELSE, IF...ELSEIF...ELSE) u SWITCH. Ejja nħarsu lejn l-użu tagħhom b'eżempji:
[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 < 100"
}
[int]$test = 5
switch ($test) {
0 {Write-Host "test = 0"}
1 {Write-Host "test = 1"}
2 {Write-Host "test = 2"}
3 {Write-Host "test = 3"}
4 {Write-Host "test = 4"}
5 {Write-Host "test = 5"}
default {Write-Host "test > 5 или значение не определено"}
}
Ċikli
PowerShell għandu diversi tipi ta’ loops: WHILE, DO WHILE, DO UNTIL, FOR, u FOREACH.
Loop bi prekundizzjoni jibda jekk/filwaqt li huwa veru:
[int]$test = 0
while ($test -lt 10) {
Write-Host $test
$test = $test + 1
}
Loops b'kondizzjoni ta' wara se jimxu mill-inqas darba, minħabba li l-kundizzjoni tiġi ċċekkjata wara li titlesta l-iterazzjoni. F'dan il-każ, DO WHILE taħdem waqt li l-kundizzjoni hija vera, u DO UNTIL taħdem waqt li tkun falza:
[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)
In-numru ta' iterazzjonijiet tal-linja FOR huwa magħruf minn qabel:
for ([int]$test = 0; $test -lt 10; $test++) {
Write-Host $test
}
Fil-linja FOREACH, itenni l-elementi ta' firxa jew ġabra (tabella hash):
$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
Write-Host $item
}
Arrays
Il-varjabbli tal-PowerShell jaħżnu mhux biss oġġetti singoli (numru, spag, eċċ.), iżda wkoll dawk multipli. L-aktar tip sempliċi ta 'varjabbli bħal dawn huwa arrays. Array jista’ jikkonsisti f’diversi elementi, element wieħed, jew ikun vojt, i.e. ma fihomx elementi. Biex tiddikjaraha, nużaw l-operatur @(), li se jkollna bżonn fl-artiklu li jmiss - huwa importanti ħafna biex inżidu arrays oħra ma 'array (ħolqien ta' arrays multidimensjonali), tgħaddi arrays għal funzjonijiet bħala argument, u kompiti simili:
$test_array = @() #создаем пустой массивMeta tiġi inizjalizzata firxa, il-valuri tagħha huma elenkati separati b'virgoli (operatur speċjali ,):
$test_array = @(1, 2, 3, 4) # создаем массив из четырех элементов F'ħafna każijiet, l-operatur @() jista' jitħalla barra:
$test_array = 1, 2, 3, 4F'dan il-każ, firxa ta 'element wieħed hija inizjalizzata kif ġej
$test_array = , 1Biex taċċessa l-elementi tal-matriċi, uża indiċi numru sħiħ ibbażat fuq żero u l-operatur tal-indiċi (parentesi kwadri):
$test_array[0] = 1Tista' tispeċifika diversi indiċi separati b'virgoli, inkl. tirrepeti:
$test_array = "один", "два", "три", "четыре"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0] 
Operatur .. (żewġ tikek - operatur tal-firxa) jirritorna firxa ta' numri interi fuq limitu speċifikat ta' fuq u ta' isfel. Pereżempju, l-espressjoni 1..4 toħroġ firxa ta' erba' elementi @(1, 2, 3, 4), u l-espressjoni 8..5 toħroġ firxa @(8, 7, 6, 5).

Bl-użu tal-operatur tal-firxa, tista 'tiiniżżalizza firxa ($test_array = 1..4) jew tikseb slice, i.e. sekwenza ta' elementi ta' firxa waħda b'indiċi minn oħra. F'dan il-każ, in-numru negattiv -1 jindika l-aħħar element tal-firxa, -2 - dak ta 'qabel l-aħħar, eċċ.
$test_array = "один", "два", "три", "четыре"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]Innota li l-valuri ta 'firxa ta' numru sħiħ jistgħu jkunu akbar mill-valur massimu tal-indiċi tal-firxa tad-dejta. F'dan il-każ, il-valuri kollha sal-aħħar wieħed jintbagħtu lura:
$test_array[0..100]Jekk tipprova taċċessa element wieħed ta' firxa ineżistenti, il-valur $null jiġi rritornat.

Fil-PowerShell, l-arrays jista’ jkun fihom elementi ta’ tipi differenti jew ikunu ttajpjati b’mod qawwi:
$test_array = 1, 2, "тест", 3, 4
for ([int]$i = 0; $i -lt $test_array.count; $i++)
{
Write-Host $test_array[$i]
}
Fejn il-proprjetà $test_array.count hija n-numru ta 'elementi ta' firxa.
Eżempju tal-ħolqien ta' firxa ittajpjata b'mod qawwi:
[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Tabelli tal-hash
Tip ieħor bażiku ta 'varjabbli f'PowerShell huma tabelli hash, imsejħa wkoll matriċi assoċjati. Hashtables huma simili għal oġġetti JSON u huma mibnija fuq bażi ta 'valur ewlieni. B'differenza mill-arrays regolari, l-elementi tagħhom huma aċċessati permezz ta 'ċwievet imsemmija, li huma proprjetajiet tal-oġġett (tista' wkoll tuża l-operatur tal-indiċi - parentesi kwadri).
Tabella hash vojta hija ddikjarata bl-użu tas-simbolu @ u l-parentesi tal-operatur:
$test_hashtable = @{}Meta tiddikjara, tista' immedjatament toħloq ċwievet u tassenja lilhom valuri:
$test_hashtable = @{one="один"; two="два"; three="три"; "some key"="some value"}Biex iżżid element ma 'tabella hash, trid tassenjaha ċavetta li għadha ma teżistix jew tuża l-metodu Żid (). Jekk issir assenjazzjoni għal ċavetta eżistenti, il-valur tagħha jinbidel. Biex tneħħi element mit-tabella tal-hash, uża l-metodu Neħħi ().
$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "четыре")
$test_hashtable.five = "пять"
$test_hashtable['five'] = "заменяем значение"
$test_hashtable.Remove("one") 
Varjabbli ta 'dan it-tip jistgħu jiġu mgħoddija bħala argumenti għal funzjonijiet u cmdlets - fl-artikolu li jmiss se nistudjaw kif isir dan, u nħarsu wkoll lejn tip ieħor simili - PSCustomObject.
Funzjonijiet
PowerShell għandu dak kollu li għandek bżonn għall-ipprogrammar proċedurali, inklużi l-funzjonijiet. Biex tiddeskrivihom, tintuża l-kelma tas-servizz Funzjoni, u wara trid tindika l-isem tal-funzjoni u l-korp magħluq fil-parentesi tal-operatur. Jekk għandek bżonn tgħaddi argumenti lill-funzjoni, jistgħu jiġu speċifikati immedjatament wara l-isem fil-parentesi.
function имя-функции (аргумент1, ..., аргументN)
{
тело-функции
}
Il-funzjoni dejjem tirritorna riżultat - din hija firxa ta 'riżultati tad-dikjarazzjonijiet kollha tagħha, jekk ikun hemm aktar minn wieħed. Jekk ikun hemm dikjarazzjoni waħda biss, jiġi rritornat valur wieħed tat-tip korrispondenti. Il-kostruzzjoni $value tar-ritorn iżid element bil-valur $value mal-firxa tar-riżultati u twaqqaf l-eżekuzzjoni tal-lista tad-dikjarazzjoni, filwaqt li funzjoni vojta tirritorna $null.
Per eżempju, ejja noħolqu funzjoni għall-kwadru ta 'numru:
function sqr ($number)
{
return $number * $number
}
Innota li fil-korp ta 'funzjoni tista' tuża kwalunkwe varjabbli ddikjarata qabel ma tissejjaħ, u funzjonijiet li jsejħu f'PowerShell jistgħu jidhru mhux tas-soltu: l-argumenti (jekk hemm) mhumiex magħluqa fil-parentesi u huma separati bi spazji.
sqr 2jew hekk:
sqr -number 2Minħabba l-mod kif jiġu mgħoddija l-argumenti, il-funzjoni nnifisha kultant teħtieġ li tkun magħluqa fil-parentesi:
function test_func ($n) {}
test_func -eq $null # функция не вызывалась
(test_func) -eq $null # результат выражения — $true 
Meta tiddeskrivi funzjoni, tista 'tassenja valuri default għall-argumenti:
function func ($arg = value) {
#тело функции
}
Hemm ukoll sintassi oħra biex tiddeskrivi l-argumenti tal-funzjoni, u l-parametri jistgħu jinqraw ukoll mill-pipeline - dan kollu se jkun utli fl-artiklu li jmiss, meta nħarsu lejn l-esportazzjoni tal-moduli u l-ħolqien tas-cmdlets tiegħek stess.
Żball fl-ipproċessar
PowerShell għandha Ipprova... Qabda... Fl-aħħarnett mekkaniżmu li jippermettilek li timmaniġġja sitwazzjonijiet ta 'eċċezzjoni. Il-blokk Ipprova fih kodiċi li fih jista' jseħħ żball, u l-blokka Catch fiha l-immaniġġjar tagħha. Jekk ma kienx hemm żball, ma jiġix eżegwit. Il-blokk Finalment jiġi eżegwit wara l-blokk Ipprova, irrispettivament minn jekk iseħħx żball, u jista 'jkun hemm diversi blokki Catch għal tipi differenti ta' eċċezzjonijiet. L-eċċezzjoni nnifisha hija miktuba għal varjabbli default mhux iddikjarat ($_) u tista 'tiġi rkuprata faċilment. Fl-eżempju hawn taħt aħna nimplimentaw protezzjoni kontra d-dħul ta' valur mhux korrett:
try {
[int]$test = Read-Host "Введите число"
100 / $test
} catch {
Write-Warning "Некорректное число"
Write-Host $_
}

Dan huwa fejn għandna ntemmu r-reviżjoni tagħna tal-baŜi tal-ipprogrammar f'PowerShell. F'artikoli futuri, ser nagħtu ħarsa aktar mill-qrib lejn il-ħidma ma 'varjabbli ta' tipi differenti, kollezzjonijiet, espressjonijiet regolari, ħolqien ta 'funzjonijiet, moduli, u cmdlets tiegħek stess, kif ukoll programmazzjoni orjentata lejn l-oġġetti.
Sors: www.habr.com
