Переменные — фундаментальная составляющая среды сценариев 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.
Экран 1. Определение типа объекта переменной посредством вызова ее метода GetType |
Наряду с использованием метода GetType, позволяющего определить тип содержащегося в переменной объекта, вы можете применить составную команду Get-Member, чтобы получить список доступных свойств и методов. Если, скажем, вы запустите команду
Get-Member -InputObject $myName
то получите список из 35 доступных свойств и методов. Некоторые из них представлены на экране 2.
Экран 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.
Экран 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, оно содержит основные сведения, которые вам необходимо усвоить.