Переменные Powershell
Переменные Powershell объявляются при помощи знака $ и могут быть созданы в любом месте скрипта. При создании переменной нет необходимости указывать ее тип, система попытается определить его сама. В имени переменной допустимы любые буквы, цифры и знак подчеркивания.
Создание переменных
Давайте создадим несколько новых переменных и проверим что все получилось
$a="Переменная1"
$b="12345"
$c=Переменная 3
$d=12345
Мы видим что успешно созданы 3 переменные: $a, $b, $d . Переменная $c не создалась и вылезла ошибка. Дело в том что в переменной $c при объявлении мы добавили пробел но не поставили кавычки. Если необходимо занести в переменную текст с пробелом нужно обязательно использовать кавычки. Посмотрим тип созданных переменных.
$a.GetType().Fullname
$b.GetType().Fullname
$c.GetType().Fullname
$d.GetType().Fullname
Переменная $a и $b имеют тип строка (System.String). Если с $a все понятно, там использовались буквы и цифра, то $b стала строкой только потому что мы занесли цифры в кавычки. А в переменной $d мы использовали цифры без кавычек, поэтому тип переменной стал число (System.Int32). Переменная $c выпала с ошибкой NULL потому как её не существует.
Важно помнить, если вы случайно попытаетесь присвоить значение переменной которая уже существует, старое значение в ней изменится на новое. Поэтому необходимо быть осторожным в именовании переменных, и перед созданием новой, просто введите в Powershell её название и нажмите Enter. Если переменная не существует то система ничего не выведет кроме пустой строки.
Хорошо, а если нам необходимо изменить тип переменной на нужный нам? Например сделать из переменной $d строку. Это возможно:
$d=[string]$d
Мы просто указываем в квадратных скобках переменную string и на выходе получаем уже System.String
Типы данных Powershell
Рассмотрим какие типы данных бывают в Powershell
Тип | Класс .NET | Описание |
---|---|---|
[string] | System.String | Строка |
[char] | System.Char | Символ (как элемент кода UTF-16) |
[bool] | System.Boolean | Булево (принимает значение $true или $false) |
[int] | System.Int32 | 32-разрядное целое число |
[long] | System.Int64 | 64-разрядное целое число |
[decimal] | System.Decimal | 128 битное десятичное число. В конце числа буква d обязательна |
[single] | System.Single | Число одиночной точности с плавающей запятой |
[double] | System.Double | Число двойной точности с плавающей запятой |
[DateTime] | System.DateTime | Представляет текущее время выраженное датой и временем суток. |
[array] | System.Object[] | Массив. Предоставляет методы для создания, изменения, поиска и сортировки массивов |
[hashtable] | System.Collections.Hashtable | Хеш-таблицы. Представляет коллекцию пар «ключ-значение», которые упорядочены по хэш-коду ключа. Отличие от массивов это использование именованных ключей вместо индексов. |
Давайте присвоим переменной $e булево значение
$e=$True
Теперь $e имеет тип System.Boolean, добавим кавычки и посмотрим что будет
$e="$True"
Переменная стала System.String. Сделаем из нее снова булево, но кавычки убирать не будем
$e=[bool]$e
С датой также можно работать сделав преобразование из строки. Давайте создадим переменную $data и добавим текст “01/01/2001” это будет в формате строки
$data="01/01/2001"
И теперь можно преобразовать эту строку в формат даты и посмотреть на вывод
[datetime]$data
Тут уже и без GetType видно что Powerhell преобразовал строку в дату, даже время поставил :). Данное преобразование может быть удобно для работы с таблицами. Когда необходимо импортировать таблицу с данными и позже преобразовать их из строк в другие типы данных.
Массив имеет тип System.Object[] и каждый элемент в массиве может иметь свой тип. Создадим переменную $massiv и добавим в неё 3 значения: два строковых и одно число. Затем определим тип каждого элемента обратившись к нему по очереди. Обратиться к элементу массива можно указав его порядковый номер в скобках []. Расчет начинается с 0.
$massiv="element1",2,"tri"
Рассмотрим последний тип данных это hashtable. Хеш-таблицы отличаются от массива тем что вместо индекса используют пару “ключ-значение”. Объявляется в таком формате: @{kluch1=”Nomer1″;kluch2=”Nomer2″;kluch3=”Nomer3″}. Давайте создадим переменную $hash и занесем в нее хеш-таблицу
$hash=@{kluch1="Nomer1";kluch2="Nomer2";kluch3="Nomer3"}
Тут как в массиве, каждый элемент может иметь свой тип. Можно применять всевозможные сортировки, выборки и исключения.
Область действия
Необходимо помнить, все созданные пользователем переменные хранятся только в текущем сеансе Powershell. После закрытия окна консоли и повторного открытия переменных уже не будет.
Существует две области действия переменных: глобальная и локальная. Глобальная область действия используется на весь сеанс Powershell. Она состоит из переменных Powershell, системных переменных и переменных определенных в консоли (в рамках текущего сеанса Powershell). Локальные переменные работаю только в той области для которой они определены (функция или скрипт) не выходя за ее пределы.
Рассмотрим работу глобальной и локальной переменной на небольшом примере:
function func_test {
$test_local="LOCAL"
$test_local
$Global:test_global="GLOBAL"
$test_global
}
Мы создали функцию в которой прописали две переменные $test_local – локальная переменная, действует только внутри этой функции. Переменная $test_global – глобальная, данные в ней сохраняются даже после завершения работы функции, в отличие от локальной.
Работа с переменными
Для работы с переменными существует 5 командлетов. Давайте посмотрим какие
Get-Command *Variable*
Для удобства сведем по ним данные в таблицу
Название | Назначение | Описание |
---|---|---|
Get-Variable | Получить значение переменой | Позволяет получить значение переменной со всеми дополнительными параметрами. Если не указать название переменной, командлет выведет список всех текущих переменных Powershell. |
New-Variable | Создать новую переменную | Создает новую переменную с возможностью задать дополнительные параметры. Можно создать переменную только для чтения, скрытую переменную или переменную с пробелом в имени |
Set-Variable | Изменить переменную | Изменение значений в переменной. В случае отсутствия переменной с указанным именем, она будет создана. |
Clear-Variable | Очистить переменную | Удаляет все значения в переменной, но не саму переменную. Тип переменой остается тот же что был до очистки значений. |
Remove-Variable | Удалить переменную | Удаляет переменную со всеми ее значениями |
Запустим командлет Get-Variable
Get-Variable
Мы видим список всех переменных Powershell, большая часть из них это системные переменные. Давайте посмотрим параметры переменной hash, та что чуть выше мы создали для хеш-таблицы.
Get-Variable hash
Видим что тут большее число параметров чем можно указать при заведение через знак $. Попробуем создать новую переменную только для чтения. После ее создания значение переменной нельзя будет изменить.
New-Variable -Name rd -Option ReadOnly -Value 100 -Description "Только для чтения"
Get-Variable -Name rd|Format-List
Попробуем изменить в ней значение
Set-Variable -Name rd -Value 200
Появилась ошибка, потому что переменная только для чтения. Данный параметр бывает полезен в скриптах. Его используют для постоянной переменной которую нельзя менять. Теперь удалим нашу переменную
Remove-Variable -Name rd -Force
Параметр -Froce указывать обязательно, иначе переменную только для чтения не удалить.
Удобство использования переменных заключается в том, что мы можем использовать ее для сокращения записи. Например, получим список процессов firefox с параметрами используемой памяти
$fire=(Get-Process -Name firefox)|select Name, PagedMemorySize64
Мы можем продолжать дальше работать с этой переменной, можем выделить первый ее элемент
$fire|Select-Object -First 1
Переменные окружения
Переменные окружения Windows также доступны из Powershell. Доступ к ним можно получить через диск ENV:
dir ENV: