В PowerShell переменные представляют из себя контейнер, в который можно помещать различные объекты. С другой стороны, каждая переменная также является объектом, с которым можно производить различные действия. Сегодня мы рассмотрим некоторые из этих действий.
Создание переменных
В самом простом варианте для создания новой переменной достаточно ввести в консоли ее допустимое имя. Имя переменной всегда начинается со знака $ и может содержать любые буквы и цифры, а также знак подчеркивания. К примеру, команда $var создаст переменную с именем $var. Однако созданная таким образом переменная не имеет значения. Создать переменную и присвоить ей какое-либо значение можно одним действием, например:
$var = 8
или
$var = ″Windows″
Учтите, что PowerShell создаст переменную только в том случае, если она не существует, иначе указанное значение присваивается существующей переменной.
Переменная может хранить в себе различные данные. Обычно при создании переменной тип данных выбирается автоматически, но при необходимости его можно уточнить, например текстовый:
[string]$var = Windows
логический:
[boolean]$b = $true
или одномерный массив:
[hashtable]$h = @{a=1;b=2;c=3}
И наоборот, можно посмотреть тип данных в переменной:
$h.GetType().FullName
Еще у переменных в PowerShell есть такое понятие как область действия (Scope). Область может быть глобальной (Global) или локальной (Local). Глобальная область распространяется на весь текущий сеанс, в эту область входят системные переменные и переменные, входящие в профили PowerShell. Локальные переменные ограничены той областью, в которой были определены (напр. функцией или скриптом) и за пределы этой области не распространяются. Есть еще область действия сценария (Script), но для команд в скрипте область действия скрипта также является локальной, так что по сути области всего две.
По умолчанию при создании переменных задается локальная область действия. Чтобы задать другое значение, нужно явно указать область, например:
$Global:test = 10
Для лучшего понимания проведем небольшой эксперимент. Создадим переменную $test и зададим ей значение Global:
$test = ″Global″
Cоздадим скрипт test.ps1, содержащий следующий текст:
$test = ″Local″
″Текущее значение переменной: $test″
Запустим скрипт и посмотрим, что он нам выдаст. Как видите, в скрипте переменная имеет значение Local. Если же после отработки скрипта еще раз вывести переменную, то она опять будет иметь значение Global. То есть значение переменной, заданное в скрипте, действует только в пределах этого скрипта.
Примечание. Здесь есть еще один тонкий момент, а именно — все переменные, определенные в консоли, имеют глобальную область действия в рамках текущего сеанса.
А теперь немного изменим скрипт:
$Global:test = ″Local″
″Текущее значение переменной: $test″
И снова запустим его. На первый взгляд ничего не изменилось, но если еще раз вывести переменную $test, то она будет иметь значение Local. Поскольку на этот раз в скрипте мы указали глобальную область действия, то значение переменной действительно и за пределами скрипта.
Примечание. Все созданные пользователем переменные существуют только в текущем сеансе PowerShell, при закрытии сеанса они будут удалены. Если вы хотите, чтобы переменная была определена в каждом сеансе, то можно добавить ее в профиль пользователя.
Управление переменными
Для создания и управления переменными можно пользоваться специальными командлетами. Их список в удобочитаемой форме можно вывести командой:
Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap
Например создать переменную можно с помощью командлета New-Variable :
New-Variable -Name var -Value 8
Изменить значение с помощью Set-Variable:
Set-Variable -Name var -Value 10
И посмотреть ее свойства с помощью Get-Variable:
Get-Variable -Name var | Format-List
Значение переменной можно очистить с помощью командлета Clear-Variable. Этот командлет удаляет только данные, хранящиеся в переменной, оставляя саму переменную. В результате переменная получает пустое значение (NULL). Если для переменной был явно указан тип данных, он также будет сохранен.
Ну и для удаления переменных служит командлет Remove-Variable. Например, удалить все созданные в текущем сеансе переменные можно командой:
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue
Преимущество использования командлетов в том, что они позволяют задавать для переменной некоторые дополнительные параметры, такие как тип, видимость и область действия. Например, если вы хотите создать переменную, которую невозможно переопределить или удалить, то сделаем так:
New-Variable -Name var -Value 8 -Option Constant
Получается постоянная переменная :), при попытке изменить или удалить такую переменную будет выдана ошибка. Вместо Constant можно поставить значение ReadOnly, которое также не дает изменять значение переменной, но позволяет ее удалить.
Примечание. Изменить значение переменной только для чтения можно командой New-Variable с параметром -Force.
Можно вообще скрыть переменную, сделав ее невидимой за пределами области, в которой она была создана:
New-Variable -Name priv -Value 10 -Visibility Private
Частная переменная не будет видна в списке переменных, а при обращении к ней будет выдана ошибка. Но пользователи смогут выполнять команды, использующие эту переменную, если эти команды запущены в том же сеансе, в котором переменная была определена. Такой подход можно использовать в скриптах или модулях, предоставляемых сторонним пользователям.
Хранение данных в переменных
Одно из наиболее полезных свойств переменных в PowerShell — это возможность сохранять в них результаты выполнения команд. Для примера выберем системный процесс spoolsv и сохраним его в переменной $proc:
$proc = Get-Process -Name spoolsv
Поскольку PowerShell работает с объектами, то полученная переменная представляет собой не просто текстовую строку, а полноценный объект со своими свойствами и методами, которыми мы можем воспользоваться. Выведем описание объекта с помощью свойства Description:
$proc.Description
Немного изменим его вывод, заменив все буквы ″p″ на ″s″ командой:
$proc.Description.Replace(″p″,″s″)
И завершим издевательства над процессом :), завершив его с помощью метода Kill, вот так:
$proc.Kill()
Системные переменные
Кроме переменных, созданных пользователем вручную, в PowerShell можно использовать системные переменные. Посмотреть список всех переменных можно, выведя содержимое переменного диска:
dir Variable:
либо командой:
Get-Variable
Кроме того, PowerShell доступны переменные окружения Windows. Эти переменные передаются через диск с именем Env:, например для вывода системной директории воспользуемся переменной:
$env:windir
Просмотреть их все можно командой:
dir Env:
Ну вот собственно и все, что я хотел рассказать о переменных в PowerShell. Надеюсь, получилось не очень скучно 🙂
Стоит упомянуть про конструкцию $v = Read-Host «Write: «