Заметки о Windows и других программных продуктах Microsoft...

Использование переменных в PowerShell

Использование переменных в PowerShell

В 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

 Хранение данных в переменных

Одно из наиболее полезных свойств переменных в 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

 

Кроме того, PowerShell доступны переменные окружения Windows. Эти переменные передаются через диск с именем Env:, например для вывода системной директории воспользуемся переменной:

$env:windir

Просмотреть их все можно командой:

dir Env:

вывод системных переменных в PowerShell

 

Ну вот собственно и все, что я хотел рассказать о переменных в PowerShell. Надеюсь, получилось не очень скучно 🙂

 
 
Комментарии

Стоит упомянуть про конструкцию $v = Read-Host «Write: «

Сергей

Подскажите.Я только пробую powershell и пока то ли не дошел до этой темы то ли не знаю где искать.
Как сделать так чтобы вместе с результатом выведенной команды можно было передать значение в переменную плюс прибавить свои символы?
Например команда get-childitem env:»PROGRAMFILES(x86)» | Format-Wide -Property Value
Вывод C:\Program Files (x86)
Могу ли я передать в переменную вывод этой команды плюс \R-studio так чтобы в переменную был вывод
C:\Program Files (x86)\Aimp3?

Странная конструкция. Если не секрет, что требуется в результате получить?
А добавить к выводу свои символы можно так +″свой текст″.