Працюємо з типами даних PowerShell, Windows IT Pro
Windows PowerShell дані, які витягують інструкції, передають в інші інструкції і виводять на консоль, повинні відповідати типам даних Microsoft.NET Framework.
У більшості випадків PowerShell автоматично призначає та перетворює дані на їхні правильні типи. Але іноді корисно контролювати цей процес, щоб будувати інструкції, які більш ефективно використовують доступні дані. Розглянемо, як можна працювати з декількома типами даних і при необхідності наводити та перетворювати дані до специфічних типів даних.
Дії з рядками
Адміністратори часто працюють із даними у формі рядків. PowerShell це простий процес. Так, у наступному прикладі рядок «cat» призначається змінною $a, потім відображається результат, тобто cat:
Оскільки рядок призначається змінною $a, PowerShell автоматично призводить $a до типу System.String. Можна використовувати метод GetType та його властивості FullName, щоб визначити тип даних змінної. Наприклад, команда
повертає результат System.String. Щоб об'єднати рядки, використовується оператор плюс (+). Наприклад, наступний програмний код додає рядок "&dog" (разом із пробілами) до змінної $a, а потім відображає результат, тобто cat & dog:
У рядок можна додати числове значення. При цьому число автоматично перетворюється на рядок. Наприклад, наступний програмний код додає 10 до змінної $a, потім виводить на екран результат, cat & dog 10:
Якщо перевірити тип даних, це буде String.
Дії з числами
Працювати з числовими даними PowerShell так само просто, як з рядковими. Числові значення призначаються як рядкові, єдина відмінність - числовізначення не полягають у лапки. Якщо вказано числове значення, PowerShell автоматично надає значенню один із чотирьох типів даних (якщо не виконується конкатенація числового значення в рядок, як у попередньому прикладі):
- «System.Int32, 32-розрядне ціле (псевдонім [int]).
- System.Int64, 64-розрядне ціле (псевдонім [long]).
- System.Double, 8-байтне десяткове число з плаваючою комою (псевдонім [double]).
- System.Decimal, 12-байтне десяткове число (псевдонім [decimal]). Точність Decimal вища, ніж Double.
Наступні інструкції показують, як PowerShell призначає типи даних числовим значенням:
$a = 1234; $a $a.GetType ().FullName $a = 12345678910; $a $a.GetType ().FullName $a = 1234.5678; $a $a.GetType ().FullName $a = 1234.5678 d; $a $a.GetType ().FullName
Як показано на екрані 1, PowerShell призначає тип даних першим трьом змінним відповідно до цього значення.

Однак, щоб призначити тип Decimal, необхідно вказати символ d після числа; інакше PowerShell обробляє значення як Double. Для з'єднання числових значень можна використовувати знак плюс. При цьому числові значення складаються, а не зчіплюються як рядкові. Наприклад, наступні інструкції призначають значення 1234 змінної $a, а потім додають 1,5678 $a:
$a = 1234; $a $a.GetType ().FullName $a = $a + 1.5678; $a $a.GetType ().FullName
Як показано на екрані 2, PowerShell складає два значення і автоматично перетворює тип змінної даних з Int32 в Double.

Якщо спробувати скласти рядок, який не є числом, з числовим значенням, буде видано повідомлення про помилку. PowerShell неможе перетворювати нечислові строкові значення числа. Наприклад, можна додати рядок "4" до числового значення, але не можна додати "four".
Дії з масивами
Масиви є колекціями типу System.Object []. Символи [] після типу даних показують, що це масив із багатьма значеннями. PowerShell автоматично призначає для масивів тип Object []. Наприклад,
створює масив із трьома рядковими змінними, а потім повертає результати
Для доступу до окремих елементів масиву використовується індекс. Індекси масивів починаються з 0, тому для доступу до першого елемента вказується ім'я масиву, за яким слідує індекс у дужках, наприклад
Ця інструкція повертає результат a. Якщо потрібно звернутися до більш ніж одного значення, просто вкажіть відповідну кількість інструкцій. Наприклад, інструкції
Додати елемент до масиву можна за допомогою оператора «плюс». Наприклад, програмний код
додає d до масиву $a, а потім відображає результати
Коли елемент d додається до масиву, PowerShell призначає йому наступний індекс (3). Числові значення масив ввести так само просто, як і рядкові значення. Наприклад, команда
І знов PowerShell призначає масиву тип Object []. У масив можна ввести числове значення будь-якого типу. У наступному прикладі призначається ціле значення (1) і два значення decimal (2.2 і 3.33) масиву $a:
Насправді масив можна ввести значення будь-якого типу. Наприклад, наступний програмний код формує масив, до якого входить числове значення (10), рядкове значення («cat») та значення date-time (поточний час і дата, отримані за допомогою команди Get-Date):
Як показано на екрані 3 тип масиву - Object [].

Проте типи даних окремих елементів залишаються специфічними цих значень. Отримати відомості про типи окремих значень можна за допомогою таких інструкцій:
$a [0].GetType().FullName $a [1].GetType().FullName $a [2].GetType().
У кожній інструкції використовується індекс для ідентифікації елемента, а потім GetType, щоб вийняти тип елемента. Результати показані на екрані 3. Щоб змінити значення масиву, потрібно вказати індекс елемента і призначити нове значення, наприклад:
PowerShell замінює значення та призначає правильний тип, як показано на екрані 3.
Дії з хеш-таблицями
Хеш-таблиці - колекції, які приймають тип даних System.Collections.Hashtable. Основна відмінність між хеш-таблицями та масивами полягає в тому, що для ідентифікації елементів у хеш-таблицях використовуються іменовані ключі замість індексів. Наприклад, у наступному прикладі призначаються три ключі та їх значення до хеш-таблиці $a, а потім відображається вміст таблиці та тип даних:
Як видно з першого рядка, хеш-таблиця будується з використанням символу @, за яким ідуть фігурні дужки, що містять колекцію пар ключ/значення. Перша пара ключ/значення – b/bird, як показано на екрані 4.

Можна отримати список ключів хеш-таблиці з використанням властивості Keys, наприклад, інструкція
отримує ключі хеш-таблиці $a, а потім використовує команду Sort-Object (на яку вказує псевдонім sort) для сортування ключів за абеткою. Аналогічно можна використовувати властивість Values для отримання значень хеш-таблиці, як показує інструкція
Можна також отримати окреме значення, посилаючись на ключ, як в інструкції
На екрані 4 показані результати останніх трьох інструкцій.Щоб додати пару ключ/значення в хеш-таблицю, можна послатися новий ключ як на існуючий, а потім ввести значення нового ключа, як у наступному прикладі:
Як показано на екрані 5, додається пара ключ/значення e/elephant.

Щоб змінити значення існуючого ключа, можна послатися на ключ і ввести нове значення, наприклад
У цьому прикладі пара d/dog замінюється на d/dingo. Видалити пару ключ/значення можна за допомогою Remove. Наприклад, видалення пари d/dingo:
Приведення та перетворення типів даних
Іноді корисно керувати типом даних, що призначається скалярним (єдиним) значенням. Наприклад, припустимо, що значення 10 обробляється як числове значення, а чи не рядок. За допомогою наступного програмного коду можна створити змінну, яка містить значення типу Double, хоча початкове значення - рядок:
Зауважте, що тип Double вказується перед значенням. Як показано на екрані 6, того ж результату можна досягти за допомогою програмного коду
Однак між двома підходами є різниця. У першому випадку значення просто замінюється тип Double. При другому підході виконується строгий контроль типу змінної, тобто цієї змінної можна призначати лише значення такого типу даних. Перевірити різницю можна, спробувавши призначити рядкове значення змінним $a і $b.
Як показано на екрані 6, можна призначити рядок змінної $a, але не $b.
Можна також контролювати тип даних, який призначається масиву. Наприклад, програмний код
призначає тип Double [] масиву $c замість типу Object [], що вибирається за умовчанням. Символи [] означають, що це масив з багатьма значеннями. Як показано на екрані 7, наступний фрагмент програмного кодуж результати:
На відміну від скалярних значень, масиви при обох підходах виконують суворий контроль типів. Наприклад, якщо спробувати змінити одне із значень на рядок за допомогою інструкцій
нічого не вийде (див. екран 7). Іноді потрібно перетворити тип даних існуючої змінної. Наприклад, перетворити змінну date-time на рядкову змінну можна за допомогою програмного коду
$e = Get-Date $e.GetType ().FullName $e = [string] $e $e.GetType ().FullName
У цьому фрагменті змінна $e спочатку містить значення, яке повертається командою Get-Date. Потім змінна перетворюється на тип String і задається інше значення змінної. Як показано на екрані 8, PowerShell змінює змінну тип String.

Аналогічний підхід можливий масиву. У наступному прикладі створюється масив типу Double [], масив перетворюється на тип String [] і значення знову присвоюються масиву:
Як показано на екрані 8, тепер тип змінної даних — String []. Навіть якщо елементи масиву належать різним типу даних, можна перетворити їх усі до одного типу за допомогою наступного програмного коду:
При перетворенні типу даних масиву до String [] PowerShell перетворює всі елементи на рядкові значення.
Покладіться на PowerShell або на себе
Як показано в цій статті, PowerShell виконує основну роботу з призначення та перетворення типів даних. Однак можна і самостійно наводити та перетворювати дані, формуючи інструкції для більш ефективного використання доступних даних.
Поділіться матеріалом з колегами та друзями