Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Тарыхый жактан алганда, Unix системаларындагы командалык сап утилиталары Windows системасына караганда жакшыраак өнүккөн, бирок жаңы чечимдин пайда болушу менен абал өзгөрдү.

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

PowerShell интерпретацияланган, көп парадигмалуу тилде жазылышы мүмкүн, ал классикалык процедуралык, объектиге багытталган жана атүгүл функционалдык программалоонун элементтерине ээ: шарттуу тармакташуу, циклдер, өзгөрмөлөр, массивдер, хэш таблицалар, класстар, каталарды иштетүү, ошондой эле функциялар, cmdlets жана түтүктөр. Мурунку макала чөйрөдө иштөөнүн негиздерине арналган, эми биз окурмандарыбызга программисттер үчүн чакан маалымдама китебин сунуштайбыз.

Мазмуну:

Comments
Өзгөрмөлөр жана алардын түрлөрү
Системалык өзгөрмөлөр
Аянттар
Айлана-чөйрөнүн өзгөрмөлөрү (чөйрө)
Арифметикалык жана салыштыруу операторлору
Дайындоо операторлору
Логикалык операторлор
Шарттуу секирүү
мерчем
Массивдер
Хеш таблицалары
милдеттери
Ката иштетүү

Кодду каалаган текст редакторунда же интеграцияланган иштеп чыгуу чөйрөсүн колдонуу менен жаза аласыз - эң оңой жолу - Microsoft серверинин операциялык системалары менен келген Windows PowerShell ISE алуу. Бул абдан татаал сценарийлер үчүн гана керек: буйруктардын кыска топтомдорун интерактивдүү түрдө аткаруу оңой.

Comments

Комментарийлерди колдонуу туура чегинүү жана боштук менен бирге жакшы программалоо стилинин бир бөлүгү болуп эсептелет:

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

<# 

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

#>

Өзгөрмөлөр жана алардын түрлөрү

PowerShellдеги өзгөрмөлөр аталган объекттер. Алардын аттары астын сызык белгисин, ошондой эле тамгаларды жана сандарды камтышы мүмкүн. $ символу ар дайым аталыштын алдында колдонулат жана өзгөрмөнү жарыялоо үчүн котормочуга жарактуу ат берүү жетиштүү:

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Өзгөрмөлөрдү инициализациялоо үчүн (ага маани берүү) дайындоо оператору (символ =) колдонулат:

$test = 100

Сиз өзгөрмөнүн түрүн атын же маанисинин алдында төрт бурчтуу кашаанын ичинде көрсөтүү менен жарыялай аласыз (түрдү чыгаруу оператору):

[int]$test = 100

$test = [int]100

PowerShellдеги өзгөрмөлөр .NET Core ичиндегилерге негизделген касиеттери жана методдору бар толук кандуу объекттер (класстар) экенин түшүнүү маанилүү. Биз негизгилерин тизмелейбиз:

Түрү (.NET классы)

баяндоо

Код мисалы

[сап] System.String

Юникод сап 

$test = "сынак"
$test = 'test'

[char]System.Char

Юникод белгиси (16 бит)

[char]$test = 'c'

[bool] System.Boolean

логикалык түрү (логикалык Чын же жалган)

[bool]$test = $true

[int] System.Int32

отуз эки бит бүтүн сан (32 бит)

[int]$test = 123456789

[узун] System.Int64

алтымыш төрт бит бүтүн сан (64 бит)

[long]$test = 12345678910

[single] System.Single

калкыма чекит саны 32 бит узундугу

[single]$тест = 12345.6789

[double]System.Double

узундугу калкыма чекит саны 64 бит (8 байт)

[double]$тест = 123456789.101112

[ондук]Система.Ондук

128-бит калкыма чекит саны (d менен аякташы керек)

[ондук]$тест = 12345.6789d

[DateTime]System.DateTime

Күн жана убакыт 

$test = GetDate

[массив] System.Object[]

элементтин индекси 0дөн башталган массив

$test_array = 1, 2, "сыноо", 3, 4

[hashtable] System.Collections.Hashtable

хэш таблицалары бул принцип боюнча курулган, аталган ачкычтары бар ассоциативдик массивдер: @{key = "value"}

$test_hashtable = @{one="one"; эки = "эки"; үч = "үч"}

PowerShell имплициттүү түргө конверсияны колдойт, мындан тышкары, өзгөрмөнүн түрүн тез эле өзгөртүүгө болот (мисалы, дайындоо операторун колдонуу), эгерде ал мажбурлап көрсөтүлбөсө - бул учурда котормочу ката берет. Мурунку мисалдагы өзгөрмөнүн түрүн GetType() ыкмасын чакырып аныктай аласыз:

$test.GetType().FullName

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Өзгөрмөлөрдү башкаруу үчүн бир катар комдлеттер бар. Ыңгайлуу түрдө алардын тизмеси буйрукту колдонуу менен көрсөтүлөт:

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

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Жарыяланган өзгөрмөлөрдү жана алардын маанилерин көрүү үчүн, сиз атайын cmdlet колдоно аласыз:

Get-Variable | more

Бул ыкма өтө түйшүктүү көрүнөт, өзгөрмөлөр менен операторлор аркылуу же алардын касиеттерине жана ыкмаларына түздөн-түз жетүү менен иштөө алда канча ыңгайлуу. Бирок, cmdlets бар болууга укугу бар, анткени алар кээ бир кошумча параметрлерди коюуга мүмкүндүк берет. Колдонуучу өзгөрмөлөрү учурдагы сессиянын ичинде гана аныкталарын түшүнүү маанилүү. Консоль жабылгандан же скрипт аяктагандан кийин, алар жок кылынат.

Системалык өзгөрмөлөр

Колдонуучу жарыялагандардан тышкары, учурдагы сессия аяктагандан кийин жок кылынбаган орнотулган (система) өзгөрмөлөр бар. Алар эки түргө бөлүнөт, ал эми PowerShell абалынын маалыматтары автоматтык өзгөрмөлөрдө сакталат, алар өз алдынча ыктыярдуу маанилерди ыйгаруу мүмкүн эмес. Аларга, мисалы, $PWD кирет:

$PWD.Path

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Артыкчылык өзгөрмөлөрү колдонуучунун артыкчылыктарын сактоо үчүн керек, алардын маанилери өзгөртүлүшү мүмкүн. Мисалы, $ErrorActionPreference колдонуу менен, буйрук интерпретаторунун өлүмгө алып келбеген каталардын пайда болушуна реакциясы коюлат.

Жарыяланган өзгөрмөлөргө жетүү үчүн операторлордон жана комдлеттерден тышкары, Variable: псевдоаккумулятор бар. Сиз аны менен башка дисктерге окшоштук боюнча иштей аласыз жана бул учурда өзгөрмөлөр файл тутумунун объекттерине окшош:

Get-ChildItem Variable: | more

же

ls Variable: | more

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Аянттар

PowerShellдеги өзгөрмөлөр үчүн масштаб (Scope) түшүнүгү бар. Глобалдык масштабдын аракети (Глобалдык) учурдагы сессиянын бардыгына тиешелүү - ал, мисалы, система өзгөрмөлөрүн камтыйт. Локалдык (Жергиликтүү) өзгөрмөлөр алар аныкталган чөйрөдө гана жеткиликтүү: функциянын ичинде айталы. Скрипттин (скрипт) чөйрөсү түшүнүгү да бар, бирок скрипт буйруктары үчүн ал негизинен жергиликтүү. Демейки боюнча, өзгөрмөлөрдү жарыялоодо, аларга локалдык масштаб берилет жана муну өзгөртүү үчүн сизге төмөнкүдөй атайын түзүлүш керек: $Global: variable = value.

Мисалы, бул сыяктуу:

$Global:test = 100

Айлана-чөйрөнүн өзгөрмөлөрү (чөйрө)

Дагы бир псевдо-диск, Env:, PowerShellден жеткиликтүү жана аны чөйрө өзгөрмөлөрүнө жетүү үчүн колдонсо болот. кабык башталганда, алар ата-энелик процесстен көчүрүлөт (башкача айтканда, учурдагы сессияны баштаган программадан) жана адатта, алардын баштапкы маанилери башкаруу панелиндеги маанилер менен бирдей. Айлана-чөйрөнүн өзгөрмөлөрүн көрүү үчүн Get-ChildItem командлетин же анын лакап аттарын (лакап аттарды) колдонуңуз: ls жана dir.

dir Env:

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Бул өзгөрмөлөр байттардын ырааттуулугу (же символдор, эгер кааласаңыз), алардын интерпретациясы аларды колдонгон программадан гана көз каранды. *-Variable командлеттери чөйрө өзгөрмөлөрү менен иштебейт. Аларга кирүү үчүн, сиз диск префиксин колдонушуңуз керек:

$env:TEST = "Hello, World!"

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Арифметикалык жана салыштыруу операторлору

PowerShell төмөнкү арифметикалык операторлорду камсыз кылат: + (кошуу), - (кемитүү), * (көбөйтүү), / (бөлүү) жана % (модуль же модуль). Арифметикалык туюнтумдун натыйжасы амалдардын жалпы кабыл алынган тартибине ылайык солдон оңго карай бааланат жана туюнтма бөлүктөрүн топтоо үчүн кашаалар колдонулат. Операторлордун ортосундагы боштуктар этибарга алынбайт, алар окууну жеңилдетүү үчүн гана колдонулат. + оператору да бириктирет, ал эми * оператору саптарды кайталайт. Эгер сиз сапка санды кошууга аракет кылсаңыз, ал сапка айланат. Мындан тышкары, PowerShell тилинде эки маанинин ортосундагы дал келүүнү текшерген жана логикалык True же False кайтаруучу көптөгөн салыштыруу операторлору бар:

оператору

баяндоо

Код мисалы

-экв

Эква / Бара (башка тилдерде = же == окшош)

$test = 100
$test -eq 123 

- болуп саналат

барабар эмес / барабар эмес (<> же != окшош)

$test = 100
$test -ne 123   

-gt

Чоңураак / Көбүрөөк (аналогдук>)

$test = 100
$test -gt 123

-ге

Чоңураак же барабар / Чоңураак же барабар (>= окшош)

$test = 100
$test -ge 123

-lt

Азыраак / Азыраак (<ке окшош)

$test = 100
$test -lt 123  

-

Аз же барабар / Аз же барабар (<= окшош)

$test = 100
$test -le 123

Башка ушул сыяктуу операторлор бар, алар, мисалы, саптарды коюу символдун негизинде салыштырууга же үлгүгө дал келүү үчүн кадимки туюнтмаларды колдонууга мүмкүндүк берет. Аларга кийинки макалаларда кеңири токтолобуз. <, > жана = символдору салыштыруу үчүн колдонулбайт, анткени алар башка максаттарда колдонулат.

Дайындоо операторлору

Эң кеңири таралган = операторунан тышкары, башка дайындоо операторлору бар: +=, -=, *=, /= жана %=. Алар дайындоо алдында маанини өзгөртөт. Өзгөрмөнүн маанисин көбөйткөн же азайтуучу ++ жана - бирдик операторлору да ушундай эле аракеттенишет - алар дайындоо операторлоруна да тиешелүү.

Логикалык операторлор

Татаал шарттарды сүрөттөө үчүн бир гана салыштыруу жетишсиз. Сиз каалаган логикалык туюнтмаларды операторлордун жардамы менен жазсаңыз болот: -жана, -же, -xor, -not and! .. Алар башка программалоо тилдериндегидей иштешет, ошол эле учурда сиз баалоо тартибин көрсөтүү үчүн кашааларды колдонсоңуз болот:

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

-not (123 -gt 321) 

!(123 -gt 321)

Шарттуу секирүү

PowerShell'деги филиал операторлору стандарттуу: ЭГЕР(ЭГЕР…БАШКА, ЭГЕР...ЭЛСЕИФ...БАШКА) жана SWITCH. Келгиле, алардын колдонулушун мисалдар менен карап көрөлү:

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

мерчем

PowerShell циклдердин бир нече түрү бар: WHILE, DO WHILE, DO FOR, FOR жана FOREACH.

Алдын ала шарты бар цикл иштейт, эгерде ал чын болсо:

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

Постшарттары бар циклдер жок дегенде бир жолу иштейт, анткени шарт итерациядан кийин текшерилет. Ошол эле учурда, шарт чын болгондо DO WHILE иштейт, ал эми DO UNTIL жалган болгондо иштейт:

[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 циклинин итерацияларынын саны алдын ала белгилүү:

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

FOREACH циклинде массивдин же коллекциянын элементтерин кайталайт (хэш таблицасы):

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

Массивдер

PowerShell өзгөрмөлөрү бир гана объекттерди (сан, сап ж.б.) сактабастан, бир нече объектти да сактайт. Мындай өзгөрмөлөрдүн эң жөнөкөй түрү массивдер. Массив бир нече элементтерден, бир элементтен турушу мүмкүн же бош болушу мүмкүн, б.а. эч кандай элементтерди камтыбайт. Ал @() операторунун жардамы менен жарыяланды, ал бизге кийинки макалада керек болот - массивге башка массивдерди кошуу (көп өлчөмдүү массивдерди түзүү), массивдерди функцияларга аргумент катары өткөрүү жана ушул сыяктуу тапшырмалар үчүн абдан маанилүү:

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

Массив инициализацияланганда, анын маанилери үтүр менен бөлүнгөн (атайын оператор ,):

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

Көпчүлүк учурларда, @() оператору жок кылынышы мүмкүн:

$test_array = 1, 2, 3, 4

Бул учурда, бир элементтен турган массив төмөнкүдөй инициализацияланат

$test_array = , 1

Массивдин элементтерине нөлгө негизделген бүтүн сан индекси жана индекс оператору (чарчы кашаа) аркылуу кирүүгө болот:

$test_array[0] = 1

Сиз үтүр менен бөлүнгөн бир нече индексти белгилей аласыз, анын ичинде. кайталануучу:

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

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

оператору .. (эки чекит - диапазон оператору) көрсөтүлгөн жогорку жана төмөнкү чектердеги бүтүн сандардын массивин кайтарат. Мисалы, 1..4 туюнтмасы төрт элементтен турган @(1, 2, 3, 4) массивди, ал эми 8..5 туюнтмасы @(8, 7, 6, 5) массивди чыгарат.

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Диапазон операторун колдонуу менен массивди инициализациялоого болот ($test_array = 1..4) же кесимди (тилим) ала аласыз, б.а. бир массивдин элементтеринин ырааттуулугу, башкасынын индекстери. Бул учурда терс сан -1 массивдин акыркы элементин, -2 - акыркыдан кийинки элементти жана башкаларды билдирет.

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

Бүтүн массивдин маанилери маалымат массивинин максималдуу индексинин маанисинен жогору болушу мүмкүн экенин эске алыңыз. Бул учурда, бардык баалуулуктар акыркысына чейин кайтарылат:

$test_array[0..100]

Эгерде сиз бир эле жок массив элементине кирүүгө аракет кылсаңыз, $null кайтарылат.

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

PowerShellде массивдер ар кандай типтеги элементтерди камтышы же катуу терилген болушу мүмкүн:

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

Бул жерде $test_array.count касиети массив элементтеринин саны.

Катуу терилген массивди түзүүнүн мисалы:

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

Хеш таблицалары

PowerShell тилиндеги өзгөрмөлөрдүн дагы бир негизги түрү - ассоциативдик массивдер катары белгилүү болгон хэш таблицалар. Hashtables JSON объектилерине окшош жана ачкыч-маани негизинде курулган. Жөнөкөй массивдерден айырмаланып, алардын элементтерине объекттин касиеттери болуп саналган аталган ачкычтар аркылуу кирүүгө болот (сиз индекс операторун – чарчы кашааларды да колдонсоңуз болот).

Бош хэш таблицасы @ символу жана оператор кашаалары аркылуу жарыяланат:

$test_hashtable = @{}

Декларациялоодо сиз дароо ачкычтарды түзүп, аларга баалуулуктарды дайындай аласыз:

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

Хэш таблицага элемент кошуу үчүн, ага али жок ачкычты дайындоо керек же Add () ыкмасын колдонуңуз. Учурдагы ачкычка дайындоо жасалса, анын мааниси өзгөрөт. Remove() ыкмасы хэш таблицасынан элементти алып салуу үчүн колдонулат.

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

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Бул түрдөгү өзгөрмөлөр функцияларга жана командлеттерге аргумент катары берилиши мүмкүн - кийинки макалада биз муну кантип жасоону изилдейбиз, ошондой эле башка окшош типти - PSCustomObject карап чыгабыз.

милдеттери

PowerShellде процедуралык программалоо үчүн керектүү нерселердин баары бар, анын ичинде функциялар. Аларды сүрөттөө үчүн Function функциялык сөзү колдонулат, андан кийин функциянын атын жана оператордук кашаага алынган тулкусун көрсөтүү керек. Функцияга аргументтерди өткөрүү керек болсо, аларды кашаанын ичиндеги аталыштан кийин дароо көрсөтсөңүз болот.

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

Функция ар дайым жыйынтыкты кайтарат - бул анын бардык операторлорунун натыйжаларынын массивдери, эгерде бирден көп болсо. Эгерде бир гана билдирүү болсо, тиешелүү түрдөгү жалгыз маани кайтарылат. Кайтаруучу $value конструкциясы жыйынтык массивине $value мааниси бар элементти кошот жана билдирүүлөр тизмесинин аткарылышын токтотот, ал эми бош функция $null кайтарат.

Мисалы, санды квадраттоо үчүн функция түзөлү:

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

Функциянын негизги бөлүгүндө сиз аны чакыруудан мурун жарыяланган каалаган өзгөрмөлөрдү колдоно аласыз жана PowerShellде функцияларды чакыруу адаттан тыш көрүнүшү мүмкүн экенин эске алыңыз: аргументтер (эгерде бар болсо) кашаанын ичинде эмес жана боштуктар менен бөлүнгөн.

sqr 2

же болбосо:

sqr -number 2

Аргументтерди берүү жолуна байланыштуу функциянын өзү кээде кашаага алынышы керек:

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

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Функцияны сүрөттөп жатканда, аргументтерге демейки маанилерди дайындай аласыз:

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

Функциянын аргументтерин сүрөттөө үчүн дагы бир синтаксис бар, андан тышкары, параметрлерди конвейерден окууга болот - мунун баары кийинки макалада, биз экспорттолгон модулдарды карап, өзүбүздүн командлеттерди түзгөндө пайдалуу болот.

Ката иштетүү

PowerShell'де өзгөчө кырдаалдарды иштетүү үчүн аракет кылуу... Кармап алуу... Акыры механизми бар. Try блогу ката болушу мүмкүн болгон кодду камтыйт, ал эми Catch блогу анын иштеткичтерин камтыйт. Эгерде ката болбосо, анда ал аткарылбайт. Finally блогу Try блогунан кийин ката пайда болгонуна карабастан аткарылат жана ар кандай түрдөгү өзгөчөлүктөр үчүн бир нече Catch блоктору болушу мүмкүн. Өзгөчө жагдайдын өзү жарыяланбаган демейки өзгөрмөгө ($_) жазылган жана аны оңой эле чыгарып алса болот. Төмөндөгү мисалда биз жараксыз маанини киргизүүдөн коргоону ишке ашырабыз:

try {

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

} catch {

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

}

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Бул PowerShell тилиндеги программалоонун негиздерин карап чыгууну аяктайт. Кийинки макалаларда биз ар кандай типтеги өзгөрмөлөр, коллекциялар, регулярдуу туюнтмалар менен иштөө, функцияларды, модулдарды жана ыңгайлаштырылган командлеттерди түзүү, ошондой эле объектиге багытталган программалоону кеңири изилдейбиз.

Windows PowerShell деген эмне жана аны эмне менен жейт? 2-бөлүк: Программалоо тилине киришүү

Source: www.habr.com

Комментарий кошуу