Переменные — фундаментальная составляющая среды сценариев PowerShell. Они существенно отличаются от переменных, используемых в интерпретаторе командной строки Cmd.exe. В интерпретаторе все переменные относятся к категории переменных среды и вызываются прежде всего с помощью команды Set. Переменные среды могут содержать только строки текста. Такая переменная может содержать и число, но вопрос о том, следует ли интерпретировать ее именно как число, предоставляется на усмотрение программы, считывающей соответствующую переменную среды.

Переменные, применяемые в PowerShell, являются не переменными среды, а внутренними переменными оболочки. Они могут содержать не только текст. Так, в переменных PowerShell могут храниться объекты (в частности, объекты Microsoft. NET Framework). К примеру, переменная PowerShell может содержать объект String или объект «число» — это может быть объект Int (integer). Благодаря использованию объектов технология PowerShell обретает исключительную гибкость.

Создание переменных

В среде PowerShell имена переменных начинаются с символа $. Значение переменной задается с помощью оператора присваивания; в качестве такового используется символ =. Переменную можно создать, просто присвоив ей некоторое значение. Так, с помощью команды

$myName = «Ferb»

мы создаем переменную с именем $myName и присваиваем ей строковое значение. Двойные кавычки («") указывают на то, что в данном случае переменной присваивается строковое значение.

Переменные PowerShell фактически являются объектами. Не углубляясь в детали, отмечу, что объекты могут содержать данные (свойства), а также операции, которые можно выполнять над этими данными (методы). В нашем примере переменная $myName в сущности представляет собой объект String. Как и другие объекты, объект String обладает свойствами и допускает использование методов. Так, свойство Length объекта String отражает число символов в строке, а применение метода ToUpper дает копию строки, символы которой конвертированы в верхний регистр. Обращение как к свойствам, так и к методам осуществляется с помощью точки (.), введенной после имени переменной. При вызове свойств скобки ( ) не используются, но они применяются при обращении к методам. Например, команда

$myName.Length

возвращает значение 4, поскольку значение рассматриваемой переменной (Ferb) состоит из четырех символов. Команда

$myName.ToUpper()

возвращает значение FERB.

Определение типа объекта, его свойств и методов

Свойства объекта, а также применяемые к нему методы зависят от типа данного объекта. К примеру, свойства и методы объекта String отличаются от соответствующих атрибутов объекта Int. Определить тип объекта переменной вы можете, обратившись к его методу GetType следующим образом:

$myName.GetType()

Как показано на экране 1, переменная $myName содержит объект String. В данной статье я не буду рассматривать столбцы IsPublic, IsSerial и BaseType.

 

Определение типа объекта переменной посредством вызова ее метода GetType
Экран 1. Определение типа объекта переменной посредством вызова ее метода GetType

Наряду с использованием метода GetType, позволяющего определить тип содержащегося в переменной объекта, вы можете применить составную команду Get-Member, чтобы получить список доступных свойств и методов. Если, скажем, вы запустите команду

Get-Member -InputObject $myName

то получите список из 35 доступных свойств и методов. Некоторые из них представлены на экране 2.

 

Определение доступных свойств и методов с?помощью составной команды Get-Member
Экран 2. Определение доступных свойств и методов с?помощью составной команды Get-Member

Что такое коллекции

Как вы заметили, переменные могут включать в себя единственный объект (скажем, объект String или Int). Но наряду с этим переменные могут содержать и множественные объекты, которые именуются коллекциями или массивами. К примеру, команда

$items = Get-ChildItem

включает составную команду Get-ChildItem, предназначенную для извлечения коллекции объектов файловой системы в текущем каталоге (то есть в каталоге, из которого вы запускаете данную команду). Полученную коллекцию команда сохраняет в переменной $items.

Что такое интерполяция переменных

Когда мы вводим в строку, заключенную в двойные кавычки, некоторую переменную, PowerShell заменяет имя этой переменной ее значением в данной строке. Это называется интерполяцией переменной. Например, при выполнении команд

$myName =»Ferb«
»Hello, $myName«

будет получен результат Hello, Ferb.

Если переменная, в которую вы подставляете значение, не является строковой, PowerShell приложит все усилия для преобразования значения этой переменной в строковую форму. Кроме того, PowerShell не осуществляет интерполяции переменных в строках, заключенных в одинарные кавычки; поэтому если вы не хотите, чтобы оболочка заменяла содержащиеся в строке переменные на их значения, можете заключать соответствующие строки в одинарные кавычки.

Когда при использовании интерполяции переменных вы хотите включить в строку какое-либо свойство объекта (или результат примененного к объекту метода), нередко возникает одна проблема. Дело в том, что стандартная нотация для вызова свойства (нотация с точкой) не дает ожидаемого результата. Так, команда

»$myName is $myName.Length characters«

возвращает неправильный результат Ferb is Ferb.Length characters.

Чтобы устранить эту проблему, воспользуйтесь предусмотренным в PowerShell оператором подвыражения $( ); если применить его внутри строки, команда возвращает желаемый результат. Так, команда

»$myName is $($myName.Length) characters«

возвращает правильный результат Ferb is 4 characters.

Вообще, если PowerShell не заменяет переменную в обрамленной двойными кавычками строке в соответствии с вашим замыслом, можете поместить эту переменную в оператор $() — и проблема будет решена.

Автоматические переменные и переменные предпочтений

В оболочке PowerShell предусмотрен накопитель Variable:, который дает пользователю возможность в ходе работы с программой обращаться к объявленным переменным. Накопитель Variable: подобен накопителю файловой системы (например, C); отличие состоит в том, что в данном случае пользователь обращается не к элементам файловой системы, а к переменным. Например, следующая команда формирует список всех переменных, используемых в текущем сеансе работы:

Get-ChildItem Variable:

Запустив эту команду на выполнение, вы увидите на экране список переменных и их значений. Первоначально все эти переменные относятся либо к числу автоматических переменных (в которых хранятся данные о состоянии PowerShell), либо к категории переменных предпочтений (в которых хранятся предпочтительные настройки пользователей PowerShell). Изменение значений автоматических переменных не допускается, но вы можете изменять значения переменных предпочтений.

Автоматические переменные дают представление о текущем состоянии PowerShell. Так, автоматическая переменная $PWD содержит данные о текущем местоположении PowerShell. Рассмотрим команды и результаты их выполнения, показанные на экране 3.

 

Использование автоматической переменной $PWD
Экран 3. Использование автоматической переменной $PWD

Переменная $PWD содержит некий объект, и первая команда считывает значение его свойства Path. В данный момент это значение — C:. Следующая команда с помощью команды Set-Location переносит переменную на накопитель Variable:. Отмечу, что свойство Path переменной $PWD отображает это изменение автоматически (отсюда и термин «автоматическая переменная»). И далее исключительно для проверки третья команда вновь считывает значение свойства Path переменной $PWD; на этот раз оно составляет Variable:. Последняя команда переносит текущее местоположение переменной обратно на накопитель C.

Переменные предпочтения позволяют изменять пользовательские настройки внутри программы PowerShell. Одна из наиболее распространенных переменных предпочтения — переменная $ErrorActionPreference; она дает возможность задавать реакцию оболочки в случае появления некритических ошибок. Некритические ошибки не блокируют дальнейшее выполнение составных команд. По умолчанию переменной $ErrorActionPreference присваивается значение Continue. Это означает, что PowerShell выдаст сообщение о некритичной ошибке и выполнение составной команды будет продолжено. Иногда возникает необходимость заблокировать выполнение составной команды немедленно после возникновения ошибки. В этом случае нужно выполнить команду

$ErrorActionPreference =»Stop«

В других ситуациях вообще нет необходимости как-либо реагировать на появление таких ошибок; тогда их можно подавлять с помощью такой команды:

$ErrorActionPreference =»SilentlyContinue«

Следует заметить, что использование переменной $ErrorActionPreference дает такой же эффект, как применение параметра составной команды -ErrorAction. Единственное различие состоит в том, что параметр составной команды -ErrorAction воздействует только на одну составную команду, тогда как переменная $ErrorActionPreference оказывает влияние на все составные команды.

Переменные среды

Технология PowerShell предусматривает использование накопителя Env:, который дает возможность обращаться к переменным среды. В оболочке PowerShell переменные копируются из родительского процесса (то есть из программы, инициировавшей текущий сеанс PowerShell). Обычно первоначальные значения переменных среды те же, что и в панели управления. Для изменения первоначальных значений переменных среды так, чтобы они не соответствовали значениям переменных в панели управления, вы можете воспользоваться одним из сценариев профилирования PowerShell, но эта тема выходит за рамки данной статьи.

Просмотреть все переменные среды, используемые в текущем сеансе PowerShell, можно с помощью команды

Get-ChildItem Env:

Данное действие эквивалентно выполнению команды Set в интерпретаторе командной строки Cmd.exe.

Пользователь Cmd.exe может заключить строку в символы % (пример — %ALLUSERSPROFILE%), тем самым предписывая интерпретатору заменить имя соответствующей переменной ее значением. В PowerShell символы % для извлечения значений переменных среды не используются. В данной оболочке значение переменной среды можно получить двумя способами. Во-первых, к переменной можно обратиться напрямую из накопителя Env: с помощью синтаксической конструкции $Env:name, где name — это имя соответствующей переменной среды. Так, если вам нужно получить значение переменной ALLUSERSPROFILE, выполните команду

$Env:ALLUSERSPROFILE

которая возвратит значение C:ProgramData. Второй способ: вы можете с помощью составной команды Get-Item считать значение переменной среды с накопителя Env:. В этом случае символ $ не используется, как показано ниже:

Get-Item Env:ALLUSERSPROFILE

Первая конструкция ($Env:name) получила наиболее широкое распространение; она применяется при использовании интерполяции переменных в строках, заключенных в двойные кавычки. Например, команда

»The ALLUSERSPROFILE variable is $Env:ALLUSERSPROFILE"

возвращает значение The ALLUSERSPROFILE variable is C:ProgramData.

Получение справочных сведений по переменным

Справочная система PowerShell содержит немалый объем информации о переменных. Рекомендую читателям ознакомиться со следующими разделами этой системы: about_Variables, about_Automatic_Variables, about_Preference_Variables и about_Environment_Variables. Чтобы получить доступ к разделам справки в оперативном режиме, используйте следующую синтаксическую конструкцию: help topic, где topic — это раздел, который вы хотите просмотреть. К примеру, если вы хотите просмотреть раздел about_Variables, выполните команду

help about_Variables

Если вы работаете с системой PowerShell 3.0 и при попытке вызвать тот или иной раздел справки получаете сообщение об ошибке, вам необходимо сначала загрузить справочную информацию. Для этого запустите PowerShell с правами администратора, щелкнув правой кнопкой мыши на значке PowerShell и выбрав в меню пункт Run as administrator. В командной строке PowerShell введите команду

Update-Help

Чтобы загрузить справочные данные, ваш компьютер должен иметь выход в Интернет.

Изучайте переменные PowerShell

Разобраться в вопросах, связанных с переменными PowerShell, очень важно, поскольку переменные составляют неотъемлемую часть механизма функционирования этой оболочки. И хотя предложенное в статье краткое введение не охватывает всего, что нужно знать о переменных PowerShell, оно содержит основные сведения, которые вам необходимо усвоить.