Частина 7. PowerShell як мова програмування (Змінні, масиви та хеш-таблиці)

26.07.2023 5 хвилин Автор: Lady Liberty

PowerShell: Змінні, Масиви та Хеш-таблиці для Початківців і Професіоналів

PowerShell – потужна мова програмування та командна оболонка, яка широко використовується у сфері адміністрування систем, автоматизації рутинних завдань та обробки даних. У нашому повному посібнику ми оглянемо ключові аспекти роботи зі змінними, масивами та хеш-таблицями в PowerShell. Почнемо з основ – розуміння змінних в PowerShell та їх типів. Дізнаємося, як створювати та присвоювати значення змінним, і як вони використовуються для зберігання різних типів даних. Далі перейдемо до масивів – структури даних, які дозволяють зберігати кілька значень у одній змінній. Масиви грають важливу роль у роботі зі списками даних та дозволяють легко здійснювати ітерацію та обробку елементів. Окрему увагу ми приділимо хеш-таблицям – корисній структурі даних, яка дозволяє зберігати пари “ключ-значення”.

Вивчимо, як створювати та використовувати хеш-таблиці, їх особливості та переваги. Наш посібник зробить вас знайомими з основами роботи зі змінними, масивами та хеш-таблицями в PowerShell, допоможе розуміти їх роль у програмуванні та адмініструванні, і забезпечить необхідні знання для ефективної роботи з цією потужною мовою програмування. У розглянутих раніше прикладах ми використовували різні числові і символьні літерали (константи), і навіть змінні PowerShell, зберігаючи у яких результати виконання команд. Крім змінних PowerShell, як і в багатьох інших мовах програмування, підтримуються масиви, а також більш специфічні структури – асоціативні масиви (хеш-таблиці).Розглянемо ці елементи мови PowerShell докладніше.

Числові та символьні літерали

Практично кожна мова програмування має можливість роботи з числами і рядками символів, причому способи їх установки можуть бути різними (наприклад, в одних мовах рядки потрібно брати в подвійні лапки, а в інших – в одинарні). Tayuke PowerShell підтримує цілі та дійсні числа, а Tayuke підтримує кілька видів символьних рядків.

Числові літерали

У PowerShell змінними є об’єкти .NET Framework. Підтримуються всі основні числові типи цієї платформи: Система. Int32, система. Int64, система. Дубль1е. При цьому явно встановлювати тип номерів немає необхідності – система сама підбирає відповідний тип для зазначеного номера. Перевіримо тип декількох чисел методом GetType:

PS С:\> (10).gettype().fullname
System.Int32
PS C:\> (10.23).gettype().fullname
System.Double
PS C:\> (10+10.23).gettype().fullname
System.Double

PowerShell надає спеціальні суфікси-множники для спрощення роботи з величинами, часто використовуваними системними адміністраторами: кілобайтами, мегабайтами і гігабайтами (табл. 7.1).

Наведемо приклади:

PS С:\> lmb+lOkb
1058816
PS С:\> 2GB+56MB
2206203904

У PowerShell можна оперувати числами в шістнадцятковому форматі, використовуючи ті ж позначення, що і в C-подібних мовах програмування: число має префікс OH, а цифри і букви A, B, C, D, E і (незалежно від регістру) можуть бути присутніми в записі номера. Наприклад:

PS С:\> 0x10
16
PS С:\> ОхА
10
PS С:\> Oxcd
205

Рядки символів

Всі рядки символів в PowerShell є об’єктами типу System. Рядок і є послідовністю 32-бітових символів Юнікоду. Довжина рядків не обмежена, вміст рядків не може бути змінено (можна тільки копіювати). PowerShell підтримує чотири типи рядків символів.

Рядки в одинарних і подвійних лапках

Рядки можуть бути визначені послідовністю символів, взятих в одинарні або подвійні лапки:

PS С:\> 'Строка в одинарных кавычках'
Строка в одинарных кавычках
PS С:\> "Строка в двойных кавычках"
Строка в двойных кавычках

Рядки можуть містити будь-який символ (включно з розривами рядків і поверненням каретки), за винятком відповідного одинарного завершального символу (одинарних або подвійних лапок). Рядок в одинарних лапках може містити подвійні лапки і навпаки:

PS С:\> 'Строка в "одинарных" кавычках'
Строка в "одинарных" кавычках
PS С:\> "Строка в 'двойных' кавычках"
Строка в 'двойных' кавычках

Якщо ви хочете помістити символ всередину рядка, який обмежує цей рядок (тобто одинарну або подвійну лапку), то вам потрібно написати цей символ двічі поспіль:

PS С:\> 'Строка в ''одинарных кавычках'
Строка в 'одинарных кавычках
PS С:\> "Строка в ""двойных кавычках"
Строка в "двойных кавычках

Рядки в подвійних лапках можна розгорнути. Его означає, що якщо всередині такого рядка є ім’я змінної або інший вираз, який можна оцінити, то значення цієї змінної або результат оцінки виразу підставляється в рядок. Наприклад:

PS С:\> $а=123
PS С:\> "$а равно $а"
123 равен 123

Якщо ім’я змінної зустрічається всередині рядка в одинарних лапках, то підстановка значення змінної не відбувається:

PS С:\> '$а равно $а'
$а равен $а

За бажанням ви можете вимкнути розширення певної змінної в рядку в подвійних лапках. Для цього потрібно вказати символ зворотної галочки перед знаком $ цієї змінної, наприклад:

PS С:\> "$а равно $а"
$а равно 123

Символи, що мають особливе значення, вставляються в рядки в подвійних лапках,  які в PowerShell починаються з символу зворотної галочки апострофа (табл. 7.2).

Вставимо символ розриву рядка в рядок подвійними лапками:

PS С:\> "Строка в пдвойных кавычках"
Строка в
двойных кавычках

Як бачите, інформація виводиться на екран в два рядки. Якщо вставити  в рядок в одинарні лапки, то розрив рядка не відбудеться:

PS С:\> 'Строка в подинарных кавычках'
Строка в 'подинарных кавычках

Крім змінних, рядки, що розширюються, можуть містити так звані підвирази (subexpression) – фрагменти коду PowerShell, обмежені символами $ ( . . . ). Наприклад:

PS С:\> "3+2 равно $(3+2)"
3+2 равно 5

Рядки типу here-string

У PowerShell поряд зі звичайними рядками в одинарних і подвійних лапках підтримуються так звані рядки типу here-string. Такі рядки зазвичай використовуються для вставки великих блоків тексту в скрипт або при генерації текстової інформації для інших програм і мають наступний формат:

@<quote><розрив рядка>текст блок<розрив рядка><цитата> @

Лапки можуть бути як одинарними, так і подвійними, і їх значення залишається таким же, як і для звичайних рядків: змінні і підвирази всередині подвійних лапок замінюються їх значеннями, а ті, що знаходяться всередині одинарних лапок, залишаються незмінними. Наприклад:

PS С:\> $а=@"
» 1 Первая строка
» $(1+1) Вторая строка
» "Третья строка"
» "@
»
PS С:\> $а
1 Первая строка
2 Вторая строка
"Третья строка"
PS С:\> $а=@' » 1 Первая строка
» $(1+1) Вторая строка
» 'Третья строка’
»
»
PS С:\> $а
1 Первая строка
$(1+1) Вторая строка
’Третья строка’

Змінні PowerShell

Зауважте, що роздільник рядків here string повинен містити розрив рядка, тому різні спеціальні символи (наприклад, одинарні або подвійні лапки) можуть використовуватися в таких рядках без обмежень.

Як ми вже знаємо, імена змінних PowerShell завжди починаються зі знака долара ($). Змінні PowerShell не потрібно заздалегідь оголошувати або описувати, вони створюються при першому присвоєнні значення змінної. Якщо спробувати отримати доступ до неіснуючої змінної, система поверне значення $pi 11.

Перевірити наявність певної змінної можна за допомогою командлета TestPath з віртуальним диском PowerShell Variab1e: вказано. Наприклад, наступна команда перевіряє, чи існує змінна з іменем MyVariab1e:

PS С:\> Test-Path Variable:MyVariabie
False »
Список всех переменных, определенных в текущем сеансе работы, можно увидеть,
обратившись к виртуальному диску variable: с помощью команды dir:
PS С:\> dir Variable:
Name
$
Value
True
args
ConfirmPreference
ConsoleFileName
DebugPreference
Error
ErrorActionPreference
Errorview
{}
High
S ilentlyContinue
{}
Continue
Normalview
Если пользователь не создавал пока своих переменных, то в системе определены
только переменные оболочки PowerShell.

Змінні оболонки PowerShell

Змінні оболонки – це набір змінних, які створюються, оголошуються PowerShell і присутні за замовчуванням у кожному сеансі. Змінні оболонки зберігаються протягом сеансу та доступні для всіх команд, сценаріїв і програм, які виконуються в цьому сеансі. Підтримуються два види змінних оболонки:

  • Автоматичні змінні. Ці змінні зберігають параметри стану оболонки PowerShell. Автоматичні змінні зберігаються і динамічно змінюються самою системою. Користувачі не можуть (і не повинні) змінювати значення цих змінних. Наприклад, значення змінної $PID є ідентифікатором поточного процесу PowerShell.exe.

  • Змінні налаштувань. Ці змінні зберігають налаштування активного користувача. Ці змінні створюються PowerShell і заповнюються значеннями за замовчуванням. Користувачі можуть змінювати значення цих змінних. Наприклад, змінна $MaximumHistoryCount визначає максимальну кількість записів у журналі сеансів.

У табл. На рисунку 7.3 наведено короткий опис деяких змінних оболонки.

Оболонкові змінні можуть використовуватися так само, як і інші типи змінних. Наприклад, наступна команда відобразить вміст домашнього каталогу PowerShell, шлях до якого зберігається в змінній shell $PSHome:

PS С:\Users\andrv> dir $PSHome
Каталог: С:\Windows\System32\WindowsPowerShell\vl.О
Mode LastWriteTime Length Name
d---- 28.09.2020 15:55 en-US
d----- 07.12.2019 12:14 Examples
d---- 28.09.2020 16:13 Modules
d---- 07.12.2019 17:36 ru
d---- 07.12.2019 17:34 ru-RU
d---- 07.12.2019 12:14 Schemas
d---- 07.12.2019 12:14 SessionConfig

Користувацькі змінні

Користувацька змінна створюється після першого надання їй значення. Наприклад, створимо цілочисленну змінну $а:

PS С:\> $а = 1
PS С:\> $а
1
PS С:\> Test-Path Variable:а
True
PS С:\> dir Variable:а
Name Value
a 1
Типы переменных
Проверим, какой тип имеет переменная $а. Для этого можно воспользоваться командлетом Get-Member ИЛИ методом getType () :
PS С:\> $а | Get-Member
TypeName: System.Int32
PS C:\> Get-Member -Inputobject $a
TypeName: System.Int32
PS C: \> $a. getType () . fullName
System.Int32
Итак, переменная $a сейчас имеет тип System. int32. Присвоим этой переменной
другое значение (строку) и вновь проверим тип:
PS С:\> $а = "ааа"
PS С:\> $а | Get-Member
TypeName: System.String

Як бачимо, тип змінної $a змінився на System. Рядок, тобто тип змінної визначається типом присвоєного їй останнього значення.

Ви також можете явно вказати тип змінної, коли визначаєте її, вказавши відповідний атрибут типу у квадратних дужках. В цьому випадку вираз з правого боку після знака рівності буде перетворено (по можливості) в цей тип. Наприклад, оголосимо цілочисельну змінну $a і присвоїмо цій змінній значення символу, яке можна перетворити в цілочисельний тип:

PS С:\> [System.Int32]$а = 10
PS С:\> $а = "123"
PS С:\> $а
123
PS С:\> $а.getType().fullName
System.^nt32
Как видим, строка ”123” была преобразована в целое число 123. Если же попытаться записать в переменную $а значение, которое не может быть преобразовано
в целое число, то возникнет ошибка:
PS С:\> $а = "ааа"
Не удается преобразовать значение "ааа" в тип "System.Int32". Ошибка: "Входная
строка имела неверный формат."
строка:1 знак:1
+ $а = "ааа"
+ ------------
+ Categoryinfo : MetadataError: (:) [],
ArgumentTransformationMetadataException
+ FullyQualifiedErrorld : RuntimeException
Вместо явного указания .NET-типа переменной можно пользоваться более краткими псевдонимами типов. Например:
PS С:\> [int]$a = 10
PS С:\> $а.GetType().FullName
System.Int32

Найбільш часто використовувані псевдоніми типів наведені в табл. 7.4.

Машинописний набір тексту

Щоб явно перетворити значення на певний тип, перед значенням потрібно вказати тип (у повній формі типу .NET або як псевдонім). Наприклад, збережемо суму двох чисел в змінній $a:

PS С:\Users\andrv> $а = 100.1 + 9.9
Переменная $а будет числом:
PS С:\Users\andrv> $a.getType().fullName
System.Double
PS C:\Users\andrv> $a
110
Теперь преобразуем при сложении каждое число к символьному типу.
PS С:\Users\andrv> $а = [string]100.1 + [string]9.9
В этом случае переменная $а будет строкой:
PS С:\Users\andrv> $а.getType().fullName
System.String
PS C:\Users\andrv> $a
100.19.9

Додаткові атрибути змінних

Для змінних в PowerShell можна вказати не тільки їх тип, але і деякі додаткові атрибути, що обмежують набір можливих значень для цих змінних. Наприклад, створимо цілочисельну змінну $a з обмеженим діапазоном значень. Для цього використовується атрибут va1idateRange.

PS С:\Users\andrv> [validateRange(1,5)][int]$а = 4
Теперь система не даст записать в эту переменную число, меньшее единицы или
большее пяти:
PS С:\Users\andrv> $а = 6
Не удалось выполнить проверку переменной, т. к. значение 6 является
недопустимым для переменной а.
строка:1 знак:1
+ $а = 6
+ —-- -
+ Categoryinfo : MetadataError: (:) [], ValidationMetadataException
+ FullyQualifiedErrorld : ValidateSetFailure
С помощью атрибута validateLengthO можно ограничить длину символьной переменной. Например:
PS С:\Users\andrv> [validateLength(0,4)][string]$s = 'abed'
В переменную $s нельзя будет сохранить строку длиной более четырех символов:
PS С:\Users\andrv> $s = ’abode'
Не удалось выполнить проверку переменной, т. к. значение abode является
недопустимым для переменной s.
строка:1 знак:1
+ $s = 'abode'
+ Categoryinfo : MetadataError: (:) [], ValidationMetadataException
+ FullyQualifiedErrorld : ValidateSetFailure

Константи

У PowerShell можна створювати константи, які є змінними, значення яких не можна змінити. Для цього використовуйте командлет New-Variab1e або Set-Variab1e з параметром -0ption Константа. Наприклад:

PS С:\Users\andrv> New-Variable -Name pi -Value 3.14 -Option Constant
Данная команда создала переменную $pi (обратите внимание, что в атрибуте -Name
знак доллара не указывается) со значением 3,14:
PS С:\Users\andrv> $pi
3.14
Глава 7. Переменные, массивы и хэш-таблицы____________________________________ 137
Попытка изменить значение такой переменной приведет к возникновению ошибки:
PS С:\Users\andrv> $pi = 1
Не удается перезаписать переменную pi, т. к. она является постоянной либо
доступна только для чтения.
строка:1 знак:1
+ $pi = 1
4- --------
+ Categoryinfo : WriteError: (pi:String) [],
SessionStateUnauthorizedAccessException
+ FullyQualifiedErrorld : VariableNotWritable

Змінні середовища Windows

Крім власних змінних, PowerShell також дозволяє працювати зі змінними середовища Windows (або змінними середовища), кожна з яких зберігається в оперативній пам’яті на час сеансу операційної системи, має своє унікальне ім’я, а його значення – рядок. Стандартні змінні середовища автоматично ініціалізуються в процесі завантаження операційної системи. До таких змінних відносяться, наприклад:

  • WINDIR – шлях до каталогу установки Windows;

  • TEMP – шлях до каталогу, де зберігаються тимчасові файли Windows;

  • RATN – це системний шлях (search path), тобто список каталогів, в яких система повинна шукати виконувані файли або загальні файли (наприклад, динамічні бібліотеки).

У PowerShell доступ до змінних середовища можна отримати через віртуальний диск Env:. Наприклад, у командлеті dir перелічено всі змінні середовища. Наприклад, список всіх змінних середовища виводиться командою том dir:

PS С:\Users\andrv> dir Env:
Name
ALLUSERSPROFILE
APPDATA
Chocolateylnstall
ChocolateyLastPathUpdate
CommonProgramFiles
CommonProgramFiles(x86)
CommonProgramW6432
COMPUTERNAME
Value
C:\ProgramData
C:\Users\andrv\AppData\Roaming
C:\ProgramData\chocolatey
132578680900827918
C:\Program Files\Common Files
C:\Program Files (x86)\Common Files
C:\Program Files\Common Files
DESKTOP-BU86I5T

Масиви в оболонці PowerShell

На відміну від багатьох мов програмування, PowerShell не вимагає спеціальних символів для вказівки початку або кінця масиву або попереднього оголошення масиву.

Для створення та ініціалізації масиву можна просто призначити значення його елементам. Значення, додані до масиву, відокремлюються комою та відокремлюються оператором присвоєння від імені змінної (імені масиву). Наприклад, наступна команда створить масив $a з трьох елементів:

PS С:\> $а = 1, 2, 3
PS С:\> $а
1
2
3

У оболонці PowerShell дужки навколо виразу вказують на те, що вираз слід обчислити. Тому список значень масивів можна вказати в дужках, що зробить масиви більш помітними в сценаріях:

PS С:\Users\andrv> $names = ('Иван', 'Сергеи', 'Андреи')
PS С:\Users\andrv> $names
Иван
Сергей
Андрей
Дополнительно перед скобками можно указать знак @:
PS С:\Users\andrv> $numbers = 0(10, 20, 45)
PS С:\Users\andrv> $nurobers
10
20
45
Выражение @ () создаст пустой массив, не содержащий элементов.
PS С:\Users\andrv> $а = @()
PS С:\Users\andrv> $а.getType().fullName
System.Object[]
PS C:\Users\andrv> $a.length
0
При объявлении пустого массива символ @ нужно указывать обязательно, без него
возникнет ошибка:
PS С:\Users\andrv> $а = ()
строка:1 знак:7
+ $а = ()
+
После ’'(’' ожидалось выражение.
+ Categoryinfo : ParserError: (:) [],
ParentContainsErrorRecordException
+ FullyQualifiedErrorld : ExpectedExpression
Можно также создать и инициализировать массив, используя оператор диапазона (..). Например, следующая команда создает массив $ь, содержащий числа от 10
до 14:
PS С:\> $Ь = 10..14
В результате массив $ь будет содержать пять значений:
PS С:\> $Ь
10
11
12
13
14

Як ми переконалися, щоб відобразити всі елементи масиву, потрібно просто ввести його назву. Довжина масиву (кількість елементів) зберігається у властивості Length:

PS С:\> $а.Length
3
Псевдонимом свойства Length является СВОЙСТВО Count:
PS С:\> $а.Count
3

Для доступу до конкретного елементу масиву потрібно вказати його порядковий номер (індекс) у квадратних дужках після імені змінної. Майте на увазі, що нумерація елементів в масиві PowerShell завжди нульова, тому для отримання значення першого елемента потрібно виконати наступну команду:

PS С:\> $а[0]
1

Негативні значення також можна вказати у вигляді індексу, а відлік буде вестися з кінця масиву. Наприклад, індексу –l буде відповідати останній елемент масиву:

PS С:\> $а[-1]
3

Мова PowerShell дозволяє отримувати кілька значень з масиву одночасно. Для цього в якості індексу масиву можна використовувати оператор діапазону або інший масив з цілими елементами. Наприклад, отримати елементи масиву $a з індексами від I до 2 можна різними способами:

PS С:\> $а[1..2]
2
3
PS С:\> $а[1, 2]
2
3
PS С:\Users\andrv> $п = 1,2
PS С:\Users\andrv> $а[$п]
2
3

Властивість Довжина можна використовувати в операторі діапазону. Наприклад, щоб відобразити елементи від індексу I до кінця масиву (останній елемент масиву має індекс Length-l), можна виконати таку команду:

PS С:\> $а[1..($а.Length-1)]
2
3
Для изменения элемента массива нужно присвоить новое значение элементу с соответствующим индексом:
PS С:\> $а[0] = 5
PS С:\> $а[1] = 3.14
PS С:\> $а[2]= "привет"
PS С:\> $а
5
3.14
привет

Операції з масивами

Останній приклад показує, що за замовчуванням масиви PowerShell можуть містити елементи різних типів, тобто вони поліморфні. Давайте подивимося, який тип має наш $a масиву:

PS С:\> $а.getType().fullName
System.Object[]

Отже, змінна $a має тип “масив елементів типу System. [ ] “. Ви можете створити масив з жорстко закодованим типом, тобто масивом, який містить елементи тільки одного типу. Для цього, як і у випадку зі звичайними скалярними змінними, перед ім’ям змінної необхідно вказати потрібний тип у квадратних дужках (див. Таблицю 6.5). Наприклад, така команда створить масив із 32-бітових цілих чисел:

PS С:\> [int[]]$a = 1,2,3,4
Если попытаться записать в данный массив значение, которое нельзя преобразовать
к целому типу, то возникнет ошибка:
PS С:\> $а[0] = "ааа"
Не удается преобразовать значение "ааа" в тип "System.Int32". Ошибка: "Входная
строка имела неверный формат."
строка:1 знак:1
+ $а[0]="ааа"
4_ ---------
+ Categoryinfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorld : InvalidCastFromStringToInteger

Збільшення довжини масиву. Об’єднання масивів

Якщо спробувати отримати доступ до елемента, який знаходиться за межами масиву, виникне помилка. Наприклад:

PS С:\> $а.Length
4
PS С:\> $а[4] = 5
Индекс находился вне границ массива.
строка:1 знак:1
+ $а[4]=5
+ —-
+ Categoryinfo : OperationStopped: (:) [], IndexOutOfRangeException
+ FullyQualifiedErrorld : System.IndexOutOfRangeException

Такі помилки пов’язані з тим, що масиви PowerShell базуються на . Масиви NET, які мають фіксовану довжину. Незважаючи на це, є спосіб збільшити довжину масиву. Для цього можна використовувати оператор об’єднання + або +=.Наприклад, наступна команда додасть до масиву $а два нових елемента зі значеннями 5 і 6.

PS С:\> $а
1
2
3
4
PS С:\> $а += 5,6
PS С:\> $а
1
2
3
4
5
6
PS С:\>

При виконанні оператора += відбувається наступне:

  1. PowerShell створює новий масив, який досить великий, щоб вмістити в нього всі елементи.

  2. Вихідний вміст масиву копіюється до нового масиву.

  3. Нові елементи копіюються в кінець нового масиву.

Таким чином, ми фактично не додаємо новий елемент в масив, а створюємо новий масив більшої розмірності. Об’єднати два масиви в один можна за допомогою оператора об’єднання +. Наприклад:

PS С:\> $х = 1,2
PS С:\> $у = 3,4
PS С:\> $z = $х + $у
PS С:\> $z
1
2
3
4

Видалення елементів

Видалити елемент з масиву не так-то просто, але ви можете створити новий масив і скопіювати в нього всі елементи, крім непотрібного. Наприклад, наступна команда створить $b масиву, який містить усі елементи масиву $a, крім значення index 2:

PS С:\> $Ь = $а[0,1 + 3..($а.length-1)]
PS С:\> $Ь
1
2
4
5
6

Дія оператора призначення

Слід враховувати, що звичайний оператор присвоєння (=) діє на масиви за посиланням. Наприклад, створимо масив $a з двох елементів і призначимо цей масив змінній $b:

PS С:\> $а = 1, 2
PS С:\> $Ь = $а
PS С:\> $Ь
1
2
Теперь изменим значение первого элемента массива $а и посмотрим еще раз на
содержимое массива $ь:
PS С:\> $а[0] = "Новое значение"
PS С:\> $Ь
Новое значение
2
PS С:\>
Как видим, содержимое массива $ь также изменилось, т. к. переменная $ь указывает на тот же объект, что и переменная $а.

Зберігання виводу командлета в масиві

Якщо командлет генерує потік об’єктів, їх можна зберігати в масиві. Наприклад:

PS С:\Users\andrv> $а = Get-Childltem

Змінна $a тепер містить масив об’єктів, що відповідають файлам та підкаталогам у каталозі C:\Users\andrv. Працювати з цим масивом можна звичайним способом:

Теперь в переменной $а содержится массив объектов, соответствующих файлам и
подкаталогам в каталоге C:\Users\andrv. С этим массивом можно работать обычным
способом:
PS С:\Users\andrv> $а.Count
30
PS С:\Users\andrv> $а[О..З]
Каталог: C:\Users\andrv
Mode LastWriteTime Length Name
d---- 15.02.2021 20:30 .config’ d---- 10.10.2020 22:02 .dbus-keyrings
d---- 11.02.2021 16:12 .local
d---- 03.03.2021 20:10 .quokka

Видалення масиву

Для видалення масиву можна скористатися командлетом Remove-Item (псевдонім de1) і видалити змінну, яка містить потрібний масив, з віртуального диска Variab1e:. Наприклад:

PS С:\> $а
1
2
3
4
5
6
PS С:\> del Variables
PS С:\> $а
PS С:\>

Хеш-таблиці (асоціативні масиви)

Крім звичайних масивів, PowerShell підтримує так звані асоціативні масиви (іноді їх ще називають словниками), які представляють собою структури для зберігання набору ключів і їх значень, пов’язаних попарно. Наприклад, ви можете використовувати прізвище людини як ключ, а дату народження як значення. Асоціативний масив забезпечує структуру для зберігання колекції імен і дат народження, при цьому кожне ім’я пов’язане з датою народження. Візуально масив пов’язаних значень можна представити у вигляді таблиці, що складається з двох стовпців, де перший стовпець – ключ, а другий – значення.

Асоціативні масиви схожі на звичайні масиви в PowerShell, але замість доступу до вмісту масиву за індексом, можна отримати доступ до елемента даних асоціативного масиву за допомогою клавіш. За допомогою цієї клавіші PowerShell повертає відповідне значення з асоціативного масиву.

PowerShell використовує спеціальний тип даних, хеш-таблицю, для зберігання вмісту асоціативного масиву, оскільки ця структура даних забезпечує швидкий механізм пошуку. Це дуже важливо, так як основне призначення асоціативного масиву – забезпечити ефективний механізм пошуку.

На відміну від звичайного масиву, для оголошення та ініціалізації хеш-таблиць використовуються спеціальні літерали: $ім’я_масиву = @{ключ1 = елемент!.; <ключ2 = елемент2; . . . }

Так, кожному значенню хеш-таблиці необхідно присвоїти мітку (ключ), перед перерахуванням вмісту масиву слід поставити символи, а перерахування елементів закінчується символом Ключі і значення розділені знаком рівності (=), пари ключ-значення розділені крапкою з комою ( ; ).

Створимо, наприклад, хеш-таблицю, в якій будуть зберігатися дані про одну людину (асоціативний масив з трьома елементами):

PS С:\> $user = @ (Фамилия="Попов" ; Имя="Андреи"; Телефон="55-55-55"}
PS С:\> $user
Name . Value
Фамилия
Имя
Телефон
Попов
Андрей
55-55-55

Після створення масиву потрібно навчитися отримувати доступ до його елементів. У PowerShell доступ до хеш-таблиць можна отримати двома способами: за допомогою нотації властивостей або нотації масивів. Обробка з використанням нотації властивостей виглядає наступним чином:

PS С:\> $user.Фамилия
Попов
PS С:\> $изег.Имя
Андрей

При такому підході хеш-таблиця розглядається як об’єкт: задаємо ім’я шуканого властивості і отримуємо відповідне значення. Доступ до асоціативного масиву за допомогою нотації масиву виглядає наступним чином:

PS С:\> $user["Фамилия”]
Попов
PS С:\> $user["Фамилия", "Имя"]
Попов
Андрей

Як бачите, при роботі з хеш-таблицею як масивом можна отримати значення відразу для декількох ключів.

Базовым типом для ассоциативных массивов PowerShell является тип
System.Collections.Hashtable:
PS С:\> $user.GetType().FullName
System.Collections.Hashtable

Цей тип визначає кілька властивостей і методів, які можна використовувати (нагадаємо, що повний список властивостей і методів можна отримати за допомогою командлета Get-Member). Наприклад, властивості ключів і Va1ues зберігають всі ключі і всі значення відповідно:

PS С:\> $user.Keys
Фамилия
Имя
Телефон
PS С:\> $user.Values
Попов
Андрей
55-55-55

Операції з хеш-таблицями

Давайте дізнаємося, як додавати елементи в хеш-таблицю, змінювати їх і видаляти. Додамо в хеш-таблицю $user дані про вік людини і місті, де він проживає:

PS С:\> $user.Возраст = 33
PS С:\> $user
Name
Возраст
Фамилия
Имя
Телефон
Value
33
Попов
Андрей
55-55-55
PS С:\> $user["Город”] = "Саранск”
PS С:\> $user
Name
Возраст
Город
Фамилия
Имя
Телефон
Value
33
Саранск
Попов
Андрей
55-55-55

Таким чином, елементи додаються в асоціативний масив за допомогою простого оператора присвоєння з використанням властивостей або позначень масиву. Змінимо значення ключа, яке вже є в масиві. Робиться це також за допомогою оператора присвоєння:

PS С:\> $user.Город = "Москва"
PS С:\> $user
Name Value
Возраст
Город
Фамилия
Имя
Телефон
33
Москва
Попов
Андрей
55-55-55
Для удаления элемента из ассоциативного массива используется метод Remove ():
PS С:\> $user.Remove("Возраст")
PS С:\> $user
Name
Город
Фамилия
Имя
Телефон
Value
Москва
Попов
Андрей
55-55-55
Можно создать пустую хэш-таблицу, не указывая ни одной пары ’’ключ — значение”. и затем заполнять ее последовательно по одному элементу:
PS С:\> $а = @{}
PS С:\> $а
PS С:\> $a.one = 1
PS С:\> $a.two = 2
PS С:\> $а
Name Value
two
one
2
1

Як і у випадку зі звичайними масивами, оператор присвоєння діє на хеш-таблиці за посиланням. Наприклад, після виконання наступних команд змінні $a і $b будуть вказувати на один і той же об’єкт:

PS С:\> $а = @{one=l;two=2}
PS С:\> $Ь = $а
PS С:\> $Ь
Name Value
two
one
2
1
Поменяв значение одного из элементов в $а, мы получим тот же результат в $ь:
PS С:\> $а.опе=3
PS С:\> $Ь
Name Value
two
one
2
3

Підсумки

  • Змінні та літерали в PowerShell є об’єктами .NET.

  • PowerShell підтримує кілька видів рядків символів. Розкладання виразів і змінних виконується для рядків в подвійних лапках.

  • PowerShell – це зворотний слеш-апостроф, а не зворотний слеш, як у більшості інших мов програмування.

  • Деякі стандартні змінні створюються та змінюються самим PowerShell.

  • Користувацькі змінні PowerShell автоматично створюються під час першого призначення їм значень. Тип змінної визначається типом її значення.

  • Коли ви створюєте та ініціалізуєте змінні в PowerShell, ви можете вказати тип та додаткові атрибути, які обмежують набір змінних, які можна використовувати.

  • PowerShell автоматично перетворює типи під час обчислення значень виразів. Ви можете виконати явне перетворення, вказавши потрібний тип у квадратних дужках.

  • PowerShell підтримує масиви і хеш-таблиці (асоціативні масиви). На відміну від багатьох мов програмування, PowerShell не використовує ніяких додаткових символів для позначення початку або кінця масиву. Значення, додані до масиву, відокремлюються комою.

Дякуємо нашій команді волонтерів за надану інформацію з відкритих джерел.

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Інші статті по темі
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.