Раздел: Tutorial

Переменные PowerShell

Переменные в PowerShell начинаются со знака $. Они могут содержать буквы, цифры, и пробелы. Их можно объявлять и присваивать им значение с помощью командлета New-Variable, но можно обойтись и без него. Как и в других языках программирования, с данными, хранящимися в переменных, можно производить различные операции.

Перемненую можно объявить с помощью командлета New-Variable :
Code:
New-Variable a1
Так создаётся переменная, не содержащая никакого значения. Создать переменную, и задать значение можно так:
Code:
New-Variable a2 -value 123

Для переменной можно задать параметр readOnly, защищающий переменные от перезаписи. Например:
Code:
New-Variable -name a3 -value 656 -Option readonly

При последующей попытке аналогичным образом записать в эту переменную другое значение, вы получите ошибку:
New-Variable : A variable with name 'a3' already exists.
At line:1 char:13
+ new-variable <<<< -name a3 -value 12
+ CategoryInfo : ResourceExists: (a3:String) [New-Variable], SessionStateException
+ FullyQualifiedErrorId : VariableAlreadyExists,Microsoft.PowerShell.Commands.NewVariableCommand

Для того, чтобы обойти параметр «readonly» (только для чтения), нужно использовать параметр -force :
Code:
New-Variable -name a3 -value 12 -force

Задать переменную можно гораздо проще — указав её имя и значение:
$a5=321
Если переменная содержит текст, то его нужно брать в кавычки:
$a6="текст переменной"

Вывести переменную можно просто написав её имя; или с помощью командлета Get-Variable, параметр -ValueOnly выведет только значение переменной (как и в случае простого обращения к ней по имени):

Если попытаться обратиться к не существующей переменной, то PowerShell вернёт значение $null (то есть — ничего). Переменные $null, $True и$False являются системными переменными, их значения переопределять нельзя.

Проверить, существует ли переменная, можно с помощью командлета Test-Path. Он вернёт значение True или False. Например:

Как уже говорилось выше, переменные могут содержать буквы, цифры и пробелы. Если имя переменной содержит пробелы, то его надо брать в фигурные скобки. Наглядно продемонстрируем, как могут выглядеть переменные:

Список всех определённых переменных в текущем сеансе PowerShell Можно вывести командой Get-ChildItem variable:

Как видно, среди прочих переменных, там присутствуют и те, с которыми мы работали в текущем сеансе. Если пользователь не создавал переменных, то в системе определены только встроенные переменные оболочки PowerShell, т.е. те, которые создаются и объявляются автоматически и присутствуют во всех сеансах Powershell. Существуют два вида переменных оболочки:

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

В них хранятся параметры состояния оболочки Powershell. Эти параметры динамически изменяются самой системой; пользователи не могут изменять эти параметры. Например, это переменная $PID, которая содержит идентификатор процесса PowerShell.exe или $PsCulture, описывающая региональные настройки языка.

  • Переменные настроек

Переменные, которые позволяют настроить PowerShell. Эти переменные создаются PowerShell и заполняются значениями по умолчанию, которые пользователь может изменить. Например, это переменная $ErrorActionPreference, определяющая поведение Powershell при появлении ошибки в момент исполнения кода, и переменная  $OFS, рассмотренная в статье функций PowerShell.

Подробнее о переменных среды Powershell см:
Get-Help about_preference_variables | more
Get-Help about_Automatic_Variables | more

Тип переменных обычно указывать не нужно: PowerShell делает это автоматически. При присвоении текста переменной, содержащей число, PowerShell сделает это за вас. Однако, тип переменной можно указать явно, указав соответствующий атрибут типа:
[system.int32]$b=15
[system.string]$c=25

Или, для удобства можно пользоваться алиасами (псевдонимами) этих типов .net :
[int]$b=15
[string]$c=25

[соответствие алиасов типам .NET см. в приложении]

Заданные таким образом переменные, Powershell будет обрабатывать соответствующим образом: переменную $b как число, переменную $c — как текст:

Поскольку PowerShell построен на базе Microsoft .NET Framework и интегрирован с ним, а переменные в .NET являются объектами, это значит,  что  ними можно выполнять различные операции как с объектами .NET. например, если мы зададим переменную, содержащую текст, то для PowerShell тип переменной будет string, что соответствует классу system.string в библиотеке классов .NET Framework Class Library. Этот класс (system.string) обладает некоторыми методами, используемыми для манипуляций со строковыми переменными. Определить класс, к которому принадлежит данная переменная, и вывести список всех методов и свойств, которыми этот класс обладает, можно с помощью командлета Get-Member, передав ему переменную по конвейеру:

В примере выше мы создали переменную $a7, с текстом «Hello, World!»; PowerShell определил, что эта переменная — строковая (относится к классу system.string). Таким образом, мы можем применять эти методы и свойства к нашей переменной:

PowerShell поддерживает работу не только с собственными переменными, но и с переменными среды Windows (environment variables), которые активно использовались(да и сейчас) в командной строке cmd. Эти переменные загружаются в оперативную память компьютера при загрузке операционной системы и хранятся там в течение всего сеанса работы с ней. Эти переменные предоставляет провайдер Environment на диске env: (подробнее о провайдерах и дисках PowerShell — в соответствующей статье). Просмотреть их можно так же, как и переменные PowerShell, с помощью командлета Get-ChildItem:



Чтобы работать с этими переменными, для них нужно указывать префикс $env: , в остальном — действия с этими переменными не отличаются от действий с обычными переменными PowerShell:

Естественно, эти переменные примут исходные значения при закрытии окна PowerShell.

Собственно, в переменные можно записывать практически всё, что угодно. Например, её можно назначить для предоставления объекта, извлекаемого командлетом:

Приложение:

Псевдонимы типов PowerShell
Алиасы Типы .NET
[int] System.Int32
[int[]] System.Int32[]
[long] System.Int64
[long[]] System.Int64[]
[string] System.String
[string[]] System.String[]
[char] System.Char
[char[]] System.Char[]
[bool] System.Boolean
[bool[]] System.Boolean[]
[byte] System.Byte
[byte[]] System.Byte[]
[double] System.Double
[double[]] System.Double[]
[decimal] System.Decimal
[decimal[]] System.Decimal[]
[float] System.Single
[single] System.Single
[regex] System.Text.RegularExpression.Regex
[array] System.Array
System.Xml.XmlDocument
[scriptblock] System.Management.Automation.ScriptBlock
[switch] System.Management.Automation.SwitchParameter
[hashtable] System.Collections.Hashtable
[psobject] System.Management.Automation.PSObject
[type] System.Type
[type[]] System.Type[]

Комментировать

Комментарии

пятнадцать − 1 =

  1. Классный, познавательный пост. А ни у кого не возникало проблем с присвоением значений в переменные в скрипте PowerShell, когда значение было на русском языке, т.е. кириллица? В командном окне — пожалуйста, а вот в скрипте:
    $CAConfigName = «УЦ ПРСД»»
    $ORGNAME «ЗАО Компания Рога и Копыта»»
    $CAFullDnsName = «WIN-JRDRI6SJ6D7″»
    $CAConfigName

    все время даёт ошибки:
    PS C:\Distribute> c:\Distribute\test.ps1
    At C:\Distribute\test.ps1:3 char:10
    + $ORGNAME «Р-Р?Р? Р?Р?Р?РїР°Р?РёС? Р Р?Р?Р° Рё Р?Р?РїС<С'Р°""
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Unexpected token '"Р-Р?Р? Р?Р?Р?РїР°Р?РёС? Р Р?Р?Р° Рё Р?Р?РїС<С'Р°""
    $CAFullDnsName = "' in expression or statement.
    At C:\Distribute\test.ps1:4 char:19
    + $CAFullDnsName = "WIN-JRDRI6SJ6D7""
    + ~~~~~~~~~~~~~~~~~
    Unexpected token 'WIN-JRDRI6SJ6D7""' in expression or statement.
    + CategoryInfo : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : UnexpectedToken

    Присутствует также проблема кодировки, с ней пока не разобрался еще…