Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Vēsturiski komandrindas utilītas Unix sistēmās ir labāk izstrādātas nekā Windows, taču līdz ar jauna risinājuma parādīšanos situācija ir mainījusies.

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

PowerShell ļauj rakstīt skriptus interpretētā, vairāku paradigmu valodā, kas satur klasiskas procesuālās, objektorientētās un pat funkcionālās programmēšanas elementus: nosacījuma zaru, cilpas, mainīgos, masīvus, jaucēj tabulas, klases, kļūdu apstrādi, kā arī funkcijas, cmdlet un cauruļvadi . Iepriekšējais raksts bija veltīta pamatiem darbam vidē, un tagad saviem lasītājiem piedāvājam nelielu uzziņu grāmatu programmētājiem.

Satura rādītājs:

Komentāri
Mainīgie lielumi un to veidi
Sistēmas mainīgie
Darbības joma
Vides mainīgie
Aritmētikas un salīdzināšanas operatori
Piešķiršanas operatori
Loģiskie operatori
Nosacīts lēciens
Cikli
Masīvi
Hash tabulas
Funkcijas
Kļūda apstrādē

Varat rakstīt kodu jebkurā teksta redaktorā vai izmantojot integrētu izstrādes vidi — vienkāršākais veids ir izmantot Windows PowerShell ISE, kas tiek piegādāta kopā ar Microsoft serveru operētājsistēmām. Tas ir nepieciešams tikai diezgan sarežģītiem skriptiem: īsas komandu kopas ir vieglāk izpildīt interaktīvi.

Komentāri

Komentāru izmantošana tiek uzskatīta par daļu no laba programmēšanas stila, kā arī pareiza atkāpe un atstarpes:

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

<# 

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

#>

Mainīgie lielumi un to veidi

PowerShell mainīgie ir nosaukti objekti. Viņu nosaukumos var būt iekļauta pasvītra rakstzīme, kā arī burti un cipari. Pirms nosaukuma vienmēr ir simbols $, un, lai deklarētu mainīgo, jums vienkārši jānorāda tulkam derīgs nosaukums:

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Lai inicializētu mainīgo (piešķirtu tam vērtību), izmantojiet piešķiršanas operatoru (simbols =):

$test = 100

Varat deklarēt mainīgo, norādot tā veidu kvadrātiekavās (tipa cast operatoru) pirms nosaukuma vai vērtības:

[int]$test = 100

$test = [int]100

Ir svarīgi saprast, ka PowerShell mainīgie ir pilnvērtīgi objekti (klases) ar īpašībām un metodēm, kuru veidi ir balstīti uz tiem, kas atrodami .NET Core. Uzskaitīsim galvenos:

Tips (.NET klase)

Apraksts

Koda piemērs

[string] System.String

Unikoda virkne 

$test = "pārbaude"
$test = 'pārbaude'

[char]Sistēma.Char

Unikoda rakstzīme (16 bitu)

[char]$test = 'c'

[būls] System.Boolean

Būla veids (būla vērtība True vai False)

[bool]$test = $true

[int]Sistēma.Int32

trīsdesmit divu bitu vesels skaitlis (32 biti)

[int]$test = 123456789

[garš] System.Int64

sešdesmit četru bitu vesels skaitlis (64 biti)

[garš]$test = 12345678910

[single]Sistēma.Single

peldošā komata skaitlis 32 biti garš

[single]$test = 12345.6789

[double]Sistēma.Double

peldošā komata skaitlis, 64 biti garš (8 baiti)

[double]$test = 123456789.101112

[decimal] System.Decimal

peldošā komata skaitlis 128 biti garš (beigās jāiekļauj d)

[decimal]$test = 12345.6789d

[DateTime] System.DateTime

datums un laiks 

$test = Get-Date

[masīvs]Sistēma.Objekts[]

masīvs, kura elementu indekss sākas ar 0

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

[hashtable] System.Collections.Hashtable

hash tabulas ir asociatīvi masīvi ar nosauktām atslēgām, kas veidotas pēc principa: @{key = “value”}

$test_hashtable = @{one="viens"; divi = "divi"; trīs = "trīs"}

PowerShell atbalsta netiešo tipa konvertēšanu, un mainīgā veidu var mainīt lidojuma laikā (piemēram, izmantojot piešķiršanas operatoru), ja vien tas nav piespiedu kārtā, un tādā gadījumā tulks radīs kļūdu. Varat noteikt mainīgā veidu no iepriekšējā piemēra, izsaucot GetType() metodi:

$test.GetType().FullName

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Mainīgo pārvaldīšanai ir vairākas cmdlet. To saraksts ērtā formā tiek parādīts, izmantojot komandu:

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

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Lai skatītu deklarētos mainīgos un to vērtības, varat izmantot īpašu cmdlet:

Get-Variable | more

Šī metode šķiet pārāk apgrūtinoša; ir daudz ērtāk strādāt ar mainīgajiem, izmantojot operatorus vai tieši piekļūstot to īpašībām un metodēm. Tomēr cmdlet ir sava vieta, jo tās ļauj iestatīt dažus papildu parametrus. Ir svarīgi saprast, ka lietotāja mainīgie tiek definēti tikai pašreizējā sesijā. Kad konsole ir aizvērta vai skripts ir pabeigts, tie tiek dzēsti.

Sistēmas mainīgie

Papildus tiem, ko deklarējis lietotājs, ir iebūvēti (sistēmas) mainīgie, kas netiek dzēsti pēc pašreizējās sesijas beigām. Tie ir sadalīti divos veidos, un PowerShell stāvokļa dati tiek glabāti automātiskajos mainīgajos, kuriem nevar piešķirt patvaļīgas vērtības. Tie ietver, piemēram, $PWD:

$PWD.Path

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Lai saglabātu lietotāja preferences, ir nepieciešami preferenču mainīgie, kuru vērtības var mainīt. Piemēram, izmantojot $ErrorActionPreference, varat iestatīt komandu tulka reakciju uz nekritiskām kļūdām.

Papildus operatoriem un cmdlet, lai piekļūtu deklarētajiem mainīgajiem, ir mainīgais: pseidoakumulators. Ar to var strādāt pēc analoģijas ar citiem diskdziņiem, un mainīgie šajā gadījumā atgādina failu sistēmas objektus:

Get-ChildItem Variable: | more

vai

ls Variable: | more

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Darbības joma

PowerShell mainīgajiem ir jēdziens, ko sauc par darbības jomu. Globālais tvērums attiecas uz visu pašreizējo sesiju - tas ietver, piemēram, sistēmas mainīgos. Vietējie mainīgie ir pieejami tikai tajā tvērumā, kurā tie tika definēti: piemēram, funkcijā. Pastāv arī skripta darbības jomas (Script) jēdziens, bet skripta komandām tas būtībā ir lokāls. Pēc noklusējuma, deklarējot mainīgos, tiem tiek piešķirts lokāls tvērums, un, lai to mainītu, ir nepieciešama īpaša konstrukcija, piemēram: $Global: mainīgais = vērtība.

Piemēram, šādi:

$Global:test = 100

Vides mainīgie

No PowerShell ir pieejams vēl viens pseido disks, Env:, ko varat izmantot, lai piekļūtu vides mainīgajiem. Kad čaula tiek startēta, tās tiek kopētas no vecākprocesa (tas ir, no programmas, kas uzsāka pašreizējo sesiju), un parasti to sākotnējās vērtības sakrīt ar vērtībām vadības panelī. Lai skatītu vides mainīgos, izmantojiet cmdlet Get-ChildItem vai tā aizstājvārdus: ls un dir.

dir Env:

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Šie mainīgie ir baitu (vai rakstzīmju, ja vēlaties) secības, kuru interpretācija ir atkarīga tikai no programmas, kas tos izmanto. *-Mainīgo cmdlet ar vides mainīgajiem nedarbojas. Lai uz tiem atsauktos, jums būs jāizmanto diska prefikss:

$env:TEST = "Hello, World!"

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Aritmētikas un salīdzināšanas operatori

PowerShell ir šādi aritmētiskie operatori: + (saskaitīšana), - (atņemšana), * (reizināšana), / (dalīšana) un % (dalīšanas modulis vai atlikums). Aritmētiskās izteiksmes rezultāts tiek novērtēts no kreisās puses uz labo saskaņā ar vispārpieņemto darbību secību, un izteiksmes daļu grupēšanai tiek izmantotas iekavas. Atstarpes starp operatoriem tiek ignorētas un tiek izmantotas tikai tādēļ, lai lietas būtu vieglāk lasāmas. Arī operators + savienojas, un operators * atkārto virknes. Ja mēģināsit virknei pievienot skaitli, tā tiks pārveidota par virkni. Turklāt PowerShell ir daudz salīdzināšanas operatoru, kas salīdzina divas vērtības un atgriež Būla vērtību True vai False:

Operators

Apraksts

Koda piemērs

-ekv

Vienāds / vienāds (analogs = vai == citās valodās)

$tests = 100
$test -eq 123 

-nē

Nav vienāds / Nav vienāds (analogs <> vai !=)

$tests = 100
$test -ne 123   

-gt

Lielāks par / Vairāk (analogs >)

$tests = 100
$test -gt 123

-vecums

Lielāks vai vienāds / Lielāks vai vienāds (analogs >=)

$tests = 100
$test -ge 123

-lt

Mazāk nekā / Mazāk (analogs <)

$tests = 100
$test -lt 123  

-viņi

Mazāks par vai vienāds / Mazāks par vai vienāds (analogs <=)

$tests = 100
$test -le 123

Ir arī citi līdzīgi operatori, kas ļauj, piemēram, salīdzināt virknes, izmantojot aizstājējzīmes, vai izmantot regulāras izteiksmes, lai saskaņotu modeli. Mēs tos sīkāk aplūkosim turpmākajos rakstos. Simboli <, > un = netiek izmantoti salīdzināšanai, jo tie tiek izmantoti citiem mērķiem.

Piešķiršanas operatori

Papildus visizplatītākajam operatoram = ir arī citi piešķiršanas operatori: +=, -=, *=, /= un %=. Viņi maina vērtību pirms piešķiršanas. Unārie operatori ++ un -, kas palielina vai samazina mainīgā lielumu, uzvedas līdzīgi - tie arī pieder pie piešķiršanas operatoriem.

Loģiskie operatori

Ar salīdzinājumu vien nepietiek, lai aprakstītu sarežģītus apstākļus. Jūs varat rakstīt jebkuras loģiskās izteiksmes, izmantojot operatorus: -and, -or, -xor, -not and!.. Tie darbojas tāpat kā citās programmēšanas valodās, bet jūs varat izmantot iekavas, lai norādītu aprēķina secību:

("Тест" -eq "Тест") -and (100 -eq 100)

-not (123 -gt 321) 

!(123 -gt 321)

Nosacīts lēciens

Atzarošanas operatori programmā PowerShell ir standarta: IF(IF...ELSE, IF...ELSEIF...ELSE) un SWITCH. Apskatīsim to izmantošanu ar piemēriem:

[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 или значение не определено"}
}

Cikli

PowerShell ir vairāku veidu cilpas: WHILE, DO WHILE, DO UNTIL, FOR un FOREACH.

Cikla ar priekšnosacījumu tiek izpildīta, ja/kamēr tā ir patiesa:

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

Cilpas ar pēcnosacījumu darbosies vismaz vienu reizi, jo nosacījums tiek pārbaudīts pēc iterācijas pabeigšanas. Šajā gadījumā DO WHILE darbojas, kamēr nosacījums ir patiess, un DO UNTIL darbojas, kamēr tas ir nepatiess:

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

FOR cilpas iterāciju skaits ir zināms iepriekš:

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

FOREACH cilpā atkārtojas masīva vai kolekcijas elementi (jaucēja tabula):

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

Masīvi

PowerShell mainīgie saglabā ne tikai atsevišķus objektus (numuru, virkni utt.), bet arī vairākus. Vienkāršākais šādu mainīgo veids ir masīvi. Masīvs var sastāvēt no vairākiem elementiem, viena elementa vai būt tukšs, t.i. nesatur elementus. Lai to deklarētu, mēs izmantojam @() operatoru, kas mums būs nepieciešams nākamajā rakstā - tas ir ļoti svarīgi, lai masīvam pievienotu citus masīvus (izveidotu daudzdimensiju masīvus), nodotu masīvus funkcijām kā argumentu un līdzīgiem uzdevumiem:

$test_array = @() #создаем пустой массив

Inicializējot masīvu, tā vērtības tiek uzskaitītas atdalot ar komatiem (īpašs operators ,):

$test_array = @(1, 2, 3, 4) # создаем массив из четырех элементов 

Vairumā gadījumu @() operatoru var izlaist:

$test_array = 1, 2, 3, 4

Šajā gadījumā viena elementa masīvs tiek inicializēts šādi

$test_array = , 1

Lai piekļūtu masīva elementiem, izmantojiet nulles veselu skaitļu indeksu un indeksa operatoru (kvadrātiekavas):

$test_array[0] = 1

Varat norādīt vairākus indeksus, atdalot tos ar komatiem, t.sk. atkārtojot:

$test_array = "один", "два", "три", "четыре"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0]

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Operators .. (divi punkti — diapazona operators) atgriež veselu skaitļu masīvu noteiktā augšējā un apakšējā robežā. Piemēram, izteiksme 1..4 izvada četru elementu masīvu @(1, 2, 3, 4), un izteiksme 8..5 izvada masīvu @(8, 7, 6, 5).

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Izmantojot diapazona operatoru, varat inicializēt masīvu ($test_array = 1..4) vai iegūt šķēli, t.i. viena masīva elementu secība ar indeksiem no cita. Šajā gadījumā negatīvais skaitlis -1 apzīmē masīva pēdējo elementu, -2 - priekšpēdējo utt.

$test_array = "один", "два", "три", "четыре"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]

Ņemiet vērā, ka veselu skaitļu masīva vērtības var būt lielākas par datu masīva maksimālo indeksa vērtību. Šajā gadījumā tiek atgrieztas visas vērtības līdz pēdējai:

$test_array[0..100]

Ja mēģināt piekļūt vienam neeksistējošam masīva elementam, tiek atgriezta vērtība $null.

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Programmā PowerShell masīvi var saturēt dažāda veida elementus vai būt stingri drukāti:

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

Kur $test_array.count rekvizīts ir masīva elementu skaits.

Stingri drukāta masīva izveides piemērs:

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

Hash tabulas

Vēl viens PowerShell mainīgā pamatveids ir jaucēj tabulas, ko sauc arī par asociatīvajiem masīviem. Hashtables ir līdzīgas JSON objektiem un ir veidotas, pamatojoties uz atslēgas vērtību. Atšķirībā no parastajiem masīviem, to elementiem var piekļūt, izmantojot nosauktos taustiņus, kas ir objekta īpašības (var izmantot arī indeksa operatoru - kvadrātiekavas).

Tukša hash tabula tiek deklarēta, izmantojot simbolu @ un operatora iekavas:

$test_hashtable = @{}

Deklarējot, jūs varat nekavējoties izveidot atslēgas un piešķirt tām vērtības:

$test_hashtable = @{one="один"; two="два"; three="три"; "some key"="some value"}

Lai pievienotu elementu jaukšanas tabulai, tam jāpiešķir atslēga, kas vēl neeksistē, vai jāizmanto metode Add(). Ja piešķiršana tiek veikta esošai atslēgai, tās vērtība mainīsies. Lai noņemtu elementu no hash tabulas, izmantojiet metodi Remove().

$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "четыре")
$test_hashtable.five = "пять"
$test_hashtable['five'] = "заменяем значение"
$test_hashtable.Remove("one")

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Šāda veida mainīgos var nodot kā argumentus funkcijām un cmdlet - nākamajā rakstā mēs pētīsim, kā tas tiek darīts, kā arī apskatīsim citu līdzīgu veidu - PSCustomObject.

Funkcijas

PowerShell ir viss, kas nepieciešams procesuālajai programmēšanai, tostarp funkcijas. Lai tos aprakstītu, tiek izmantots servisa vārds Funkcija, pēc kura jānorāda funkcijas nosaukums un korpuss, kas ievietots operatora iekavās. Ja funkcijai ir jānodod argumenti, tos var norādīt uzreiz aiz nosaukuma iekavās.

function имя-функции (аргумент1, ..., аргументN) 
{ 
        тело-функции 
} 

Funkcija vienmēr atgriež rezultātu - tas ir visu tās paziņojumu rezultātu masīvs, ja ir vairāk nekā viens. Ja ir tikai viens priekšraksts, tiek atgriezta viena attiecīgā veida vērtība. Atgrieztā $vērtības konstrukcija pievieno rezultātu masīvam elementu ar vērtību $value un pārtrauc priekšrakstu saraksta izpildi, savukārt tukša funkcija atgriež $null.

Piemēram, izveidosim funkciju skaitļa kvadrātā:

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

Ņemiet vērā, ka funkcijas pamattekstā varat izmantot jebkurus mainīgos, kas deklarēti pirms tās izsaukšanas, un funkciju izsaukšana programmā PowerShell var šķist neparasta: argumenti (ja tādi ir) nav ievietoti iekavās un ir atdalīti ar atstarpēm.

sqr 2

vai šādi:

sqr -number 2

Argumentu nodošanas veida dēļ pati funkcija dažreiz ir jāiekļauj iekavās:

function test_func ($n) {}
test_func -eq $null     # функция не вызывалась
(test_func) -eq $null   # результат выражения — $true

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Aprakstot funkciju, argumentiem varat piešķirt noklusējuma vērtības:

function func ($arg = value) {
         #тело функции
}

Funkciju argumentu aprakstīšanai ir arī cita sintakse, un parametrus var nolasīt arī no konveijera – tas viss noderēs nākamajā rakstā, kad apskatīsim moduļu eksportēšanu un savu cmdlet izveidi.

Kļūda apstrādē

PowerShell ir Try...Catch...Finally mehānisms, kas ļauj rīkoties izņēmuma situācijās. Blokā Try ir kods, kurā var rasties kļūda, un blokā Catch ir tā apdarinātājs. Ja kļūdas nav, tas netiek izpildīts. Bloks Beidzot tiek izpildīts pēc bloka Try neatkarīgi no tā, vai ir radusies kļūda, un dažāda veida izņēmumiem var būt vairāki Catch bloki. Pats izņēmums ir ierakstīts nedeklarētā noklusējuma mainīgajā ($_), un to var viegli izgūt. Tālāk esošajā piemērā tiek ieviesta aizsardzība pret nepareizas vērtības ievadīšanu:

try {

        [int]$test = Read-Host "Введите число"
        100 / $test

} catch {

         Write-Warning "Некорректное число"
         Write-Host $_

}

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Šeit mums jābeidz mūsu PowerShell programmēšanas pamatu apskats. Nākamajos rakstos mēs sīkāk aplūkosim darbu ar dažāda veida mainīgajiem, kolekcijām, regulārām izteiksmēm, funkciju, moduļu un savu cmdlet izveidi, kā arī objektu orientētu programmēšanu.

Kas ir Windows PowerShell un ar ko to ēd? 2. daļa: Ievads programmēšanas valodā

Avots: www.habr.com

Pievieno komentāru