Поделиться через


5. Переменные

Редакционная заметка

Важный

Спецификация языка Windows PowerShell 3.0 была опубликована в декабре 2012 года и основана на Windows PowerShell 3.0. Эта спецификация не отражает текущее состояние PowerShell. Нет плана обновить эту документацию, чтобы отразить текущее состояние. Эта документация представлена здесь для получения исторической справки.

Документ спецификации доступен в формате Microsoft Word из Центра загрузки Майкрософт: https://www.microsoft.com/download/details.aspx?id=36389. Этот документ Word был преобразован для презентации здесь, в Microsoft Learn. Во время преобразования некоторые редакционные изменения были внесены в соответствии с форматированием платформы Docs. Исправлены некоторые опечатки и незначительные ошибки.

Переменная представляет расположение хранилища для значения, а это значение имеет тип. Традиционные языки процедурного программирования статически типизированы; это значит, что тип переменной во время выполнения является тем же, с которым она была объявлена при компиляции. Объектно-ориентированные языки добавляют идею наследования, которая позволяет типу среды выполнения переменной быть той, с которой она была объявлена во время компиляции или какой-либо тип, производный от этого типа. Будучи динамически типизированным языком, переменные в PowerShell не имеют определённых типов. На самом деле переменные не определены; они просто создаются, когда им впервые присваивается значение. И хотя переменная может быть ограничена (§5.3) для хранения значения заданного типа, сведения о типе в назначении не всегда могут быть проверены статически.

В разное время переменная может быть связана со значениями разных типов с помощью назначения (§7.11) или использования операторов ++ и ‑‑ (§7.1.5, §7.2.6). При изменении значения, связанного с переменной, тип этого значения может измениться. Например

$i = "abc"        # $i holds a value of type string
$i = 2147483647   # $i holds a value of type int
++$i              # $i now holds a value of type double because
                  # 2147483648 is too big to fit in type int

Любое использование переменной, которая не была создана, приводит к $null значению. Чтобы узнать, определена ли переменная, используйте командлет Test-Path.

5.1 Записываемое расположение

доступное для записи расположение — это выражение, указывающее ресурс, к которому команда имеет доступ на чтение и запись. Записываемое расположение может быть переменной (§5), элемент массива (§9), связанное значение в хэш-файле, доступ к которым осуществляется через подстрок (§10), свойство (§7.1.2), или хранилище, управляемое поставщиком (§3.1).

Категории переменных 5.2

PowerShell определяет следующие категории переменных: статические переменные, переменные экземпляра, элементы массива, пары хэштеблных ключей и значений, параметры, обычные переменные и переменные на дисках поставщика. Следующие подразделы описывают каждую из этих категорий.

В следующем примере

function F ($p1, $p2) {
    $radius = 2.45
    $circumference = 2 * ([Math]::PI) * $radius

    $date = Get-Date -Date "2010-2-1 10:12:14 pm"
    $month = $date.Month

    $values = 10, 55, 93, 102
    $value = $values[2]

    $h1 = @{ FirstName = "James"; LastName = "Anderson" }
    $h1.FirstName = "Smith"

    $Alias:A = "Help"
    $Env:MyPath = "E:\Temp"
    ${E:output.txt} = 123
    $Function:F = { "Hello there" }
    $Variable:v = 10
}
  • [Math::PI] является статической переменной
  • $date.Month — это переменная экземпляра
  • $values[2] — это элемент массива
  • $h1.FirstName — это ключ Hashtable, значение которого соответствует $h1['FirstName']'
  • $p1 и $p2 — это параметры
  • $radius, $circumference, $date, $month, $values, $valueи $h1 являются обычными переменными
  • $Alias:A, $Env:MyPath, ${E:output.txt}и $Function:F являются переменными на соответствующих дисках поставщика.
  • $Variable:v на самом деле является обычной переменной, заданной с использованием её полного имени диска поставщика.

5.2.1 Статические переменные

Элемент данных объекта, который принадлежит типу объекта, а не к конкретному экземпляру типа, называется статической переменной. Примеры см. §4.2.3, §4.2.4.1и §4.3.8.

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

Память для создания и удаления объектов, содержащих статические переменные, управляется средой узла и системой сборки мусора.

Сведения о доступе к статической переменной см. в §7.1.2.

Статический элемент данных может быть полем или свойством.

5.2.2 Переменные экземпляра

Элемент данных объекта, который принадлежит конкретному экземпляру типа объекта, а не самому типу, называется переменной экземпляра. Примеры см. в разделе §4.3.1, §4.3.2и §4.3.3.

Среда узла PowerShell может предоставить способ создания новых типов, содержащих переменные экземпляра, или добавить новые переменные экземпляра в существующие типы.

Память для создания и удаления объектов, содержащих статические переменные, управляется средой узла и системой сборки мусора.

Для получения информации о доступе к переменной экземпляра см. §7.1.2.

Элемент данных экземпляра может быть полем или свойством.

Элементы массива 5.2.3

Массив можно создать с помощью унарного оператора запятой (§7.2.1), подвыражения (§7.1.6), выражения массива (§7.1.7), двоичного оператора запятой (§7.3), оператора диапазона (§7.4) или командлета New-Object.

Память для создания и удаления массивов управляется средой узла и системой сборки мусора.

Массивы и элементы массивов рассматриваются в §9.

5.2.4 Пары ключа/значения в хэш-таблице

Хэш-таблица создается с помощью хэш-литерала (§2.3.5.6) или командлета New-Object. С помощью оператора [] можно добавить новую пару "ключ-значение" (§7.1.4.3).

Память для создания и удаления хеш-таблиц управляется средой исполнения и системой сборки мусора.

Хеш-таблицы обсуждаются в §10.

Параметры 5.2.5

Параметр создается при вызове родительской команды и инициализируется значением аргумента, предоставленного в вызове или в среде узла. Параметр перестает существовать при завершении родительской команды.

Параметры рассматриваются в §8.10.

5.2.6 Обычные переменные

Обычная переменная определяется выражением присваивания (§7.11) или оператором foreach (§8.4.4). Некоторые обычные переменные предопределяются средой выполнения, а другие являются временными, появляясь и исчезая по мере необходимости во время исполнения программы.

Время существования обычной переменной — это период выполнения программы, в течение которого для неё гарантированно зарезервировано хранилище. Время существования начинается с момента входа в связанную область и заканчивается не ранее окончания выполнения этой области. Если родительская область введена рекурсивно или итеративно, каждый раз создается новый экземпляр локальной переменной.

Хранилище, на которое ссылается обычная переменная, освобождается независимо от времени существования этой переменной.

Обычная переменная может быть явно названа с помощью префикса пространства имен (§5.2.7).

5.2.7 Переменные на дисковых накопителях поставщика

Концепция поставщиков и приводов представлена в §3.1, при этом каждый поставщик может предоставлять собственное пространство имен привода(-ов). Это позволяет получить доступ к ресурсам на этих дисках, как если бы они были обычными переменными (§5.2.6). На самом деле обычная переменная хранится на диске поставщика файловой системы Variable: (§3.1.5) и к ней можно получить доступ по её обычному имени или полному имени пространства имен.

Некоторые типы переменных пространства имен ограничены неявно (§5.3).

5.3 Ограниченные переменные

По умолчанию переменная может назначить значение любого типа. Однако переменная может быть ограничена для назначения значений заданного типа, указав этот тип как литерал типа перед его именем при назначении или в параметре. Например

[int]$i = 10   # constrains $i to designating ints only
$i = "Hello"   # error, no conversion to int
$i = "0x10"    # ok, conversion to int
$i = $true     # ok, conversion to int

function F ([int]$p1, [switch]$p2, [regex]$p3) { ... }

Любая переменная, относящаяся к пространству имен Env:, Псевдоним:или в пространстве имен файловой системы (§2.3.2, §3.1) ограничивается неявно типом string. Любая переменная, принадлежащая функции пространства имен: (§2.3.2, §3.1) ограничена неявно типом scriptblock.