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


2. Лексическая структура

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

Важный

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

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

2.1 Грамматики

Эта спецификация показывает синтаксис языка PowerShell с помощью двух грамматик. В лексической грамматике (§B.1) показано, как символы Юникода объединяются для формирования конца строк, комментариев, пробелов и маркеров. синтаксической грамматики (§B.2) показывает, как маркеры, полученные из лексической грамматики, объединяются для формирования скриптов PowerShell.

Для удобства фрагменты этих грамматик реплицируются в соответствующих местах по всей этой спецификации.

Любое использование символов от "a" до "z" в грамматиках регистронезависимо. Это означает, что буква в переменных, псевдонимах, именах функций, ключевых словах, инструкциях и операторах игнорируется. Однако в рамках этой спецификации такие имена записываются в нижнем регистре, за исключением некоторых автоматических и предпочточных переменных.

2.2 Лексический анализ

2.2.1 Скрипты

Синтаксис:

Подсказка

Нотация ~opt~ в определениях синтаксиса указывает, что лексическая сущность является необязательной в синтаксисе.

input:
    input-elements~opt~   signature-block~opt~

input-elements:
    input-element
    input-elements   input-element

input-element:
    whitespace
    comment
    token

signature-block:
    signature-begin   signature   signature-end

signature-begin:
    new-line-character   # SIG # Begin signature block   new-line-character

signature:
    base64 encoded signature blob in multiple single-line-comments

signature-end:
    new-line-character   # SIG # End signature block   new-line-character

Описание:

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

Скрипт — это группа команд PowerShell, хранящихся вфайла скрипта . Сам скрипт не имеет имени, в целом, и принимает его имя из исходного файла. Конец этого файла указывает конец скрипта.

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

2.2.2 Конечные символы строки

Синтаксис:

new-line-character:
    Carriage return character (U+000D)
    Line feed character (U+000A)
    Carriage return character (U+000D) followed by line feed character (U+000A)

new-lines:
    new-line-character
    new-lines new-line-character

Описание:

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

Терминатор строки можно рассматривать как пробел (§2.2.4).

2.2.3 Примечания

Синтаксис:

comment:
    single-line-comment
    requires-comment
    delimited-comment

single-line-comment:
    # input-characters~opt~

input-characters:
    input-character
    input-characters input-character

input-character:
    Any Unicode character except a new-line-character

requires-comment:
    #Requires whitespace command-arguments

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

dashdash:
    dash dash

delimited-comment:
    < # delimited-comment-text~opt~ hashes >

delimited-comment-text:
    delimited-comment-section
    delimited-comment-text delimited-comment-section

delimited-comment-section:
    >
    hashes~opt~  not-greater-than-or-hash

hashes:
    #
    hashes #

not-greater-than-or-hash:
    Any Unicode character except > or #

Описание:

Исходный код можно аннотировать с помощью комментариев .

однострочного комментария начинается с символа и заканчивается нового символа строки.

с разделителями-разделителями начинается с пары символов и заканчивается парой символов . Она может встречаться как часть исходной строки, как целая исходная строка или может охватывать любое количество исходных строк.

Комментарий рассматривается как пустое пространство.

Приведенные выше производства подразумевают, что

  • Комментарии не вложены.
  • Последовательности символов <# и #> не имеют специального значения в однострочных комментариях.
  • Символ # не имеет специального значения в комментарии с разделителями.

Лексическая грамматика подразумевает, что комментарии не могут возникать внутри маркеров.

(См. §A для получения информации о создании файлов скриптов, содержащих специальные комментарии, используемые для генерации документации из файлов скриптов.)

Требование комментария для , указанное в, устанавливает критерии, которые должны быть выполнены для разрешения выполнения содержащего скрипта. Основным критерием является версия PowerShell, используемая для запуска скрипта. Минимальное требование версии указано следующим образом:

#Requires -Version N[.n]

Где N является основной (обязательной) версией и n является (необязательной) дополнительной версией.

В любом файле скрипта может присутствовать requires-comment, однако он не может присутствовать внутри функции или cmdlet. Он должен быть первым элементом в исходной строке. Сценарий может содержать несколько требуетсякомментариев.

Последовательность символов распознается только как комментарий, если эта последовательность начинается с # или <#. Например, hello#there рассматривается как единый маркер, в то время как hello #there считается маркером "hello", за которым следует однострочный комментарий. Также, наряду с пробелами, начальная последовательность комментариев может следовать непосредственно за любым символом конца выражения или инструкции (например, ), }, ], ', "или ;).

требуется комментарий, не может присутствовать внутри оснастки.

Существует четыре других формы требуется комментарий:

#Requires -Assembly AssemblyId
#Requires -Module ModuleName
#Requires -PSSnapin PSSnapin [ -Version *N* [.n] ]
#Requires -ShellId ShellId

2.2.4 Пробел

Синтаксис:

whitespace:
    Any character with Unicode class Zs, Zl, or Zp
    Horizontal tab character (U+0009)
    Vertical tab character (U+000B)
    Form feed character (U+000C)
    ` (The backtick character U+0060) followed by new-line-character

Описание:

Пробел состоит из любой последовательности одного или нескольких пробельных символов.

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

В отличие от некоторых популярных языков, PowerShell не считает символы конца строки (§2.2.2) пробелами. Однако разделитель строки может рассматриваться как пробел, если перед ним сразу идет символ обратной кавычки, ` (U+0060). Это необходимо, если содержимое строки завершается синтаксически, но следующая строка содержит маркеры, предназначенные для связи с предыдущей строкой. Например

$number = 10 # assigns 10 to $number; nothing is written to the pipeline
+ 20 # writes 20 to the pipeline
- 50 # writes -50 to the pipeline
$number # writes $number's value, 10, to the pipeline

В этом примере обратный апостроф указывает, что исходная строка продолжается. Следующее выражение эквивалентно $number = 10 + 20 - 50.

$number = 10 `
+ 20 `
- 50
$number # writes $number's value to the pipeline
-20

2.3 Токены

Синтаксис:

token:
    keyword
    variable
    command
    command-parameter
    command-argument-token
    integer-literal
    real-literal
    string-literal
    type-literal
    operator-or-punctuator

Описание:

маркера — самый маленький лексический элемент в языке программирования PowerShell.

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

Ключевые слова 2.3.1

Синтаксис:

keyword: one of
    begin          break          catch       class
    continue       data           define      do
    dynamicparam   else           elseif      end
    exit           filter         finally     for
    foreach        from           function    if
    in             inlinescript   parallel    param
    process        return         switch      throw
    trap           try            until       using
    var            while          workflow

Описание:

Ключевое слово — это последовательность символов, которая имеет особое значение при использовании в месте, зависяющем от контекста. Чаще всего это первый маркер в инструкции ; однако существуют другие расположения, как указано грамматикой. (Маркер, который выглядит как ключевое слово, но не используется в контексте ключевого слова, называется имя команды или аргумент команды.)

Ключевые слова class, define, from, usingи var зарезервированы для дальнейшего использования.

Заметка

Примечание редактора. В PowerShell 5.0 появились ключевые слова class и using. См. about_Classes и about_Using.

2.3.2 Переменные

Синтаксис:

variable:
    $$
    $?
    $^
    $   variable-scope~opt~  variable-characters
    @   variable-scope~opt~  variable-characters
    braced-variable


braced-variable:
    ${   variable-scope~opt~   braced-variable-characters   }

variable-scope:
    Global:
    Local:
    Private:
    Script:
    Using:
    Workflow:
    variable-namespace

variable-namespace:
    variable-characters   :

variable-characters:
    variable-character
    variable-characters   variable-character

variable-character:
    A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nd
    _   (The underscore character U+005F)
    ?

braced-variable-characters:
    braced-variable-character
    braced-variable-characters   braced-variable-character

braced-variable-character:
    Any Unicode character except
        }   (The closing curly brace character U+007D)
        `   (The backtick character U+0060)
    escaped-character

escaped-character:
    `   (The backtick character U+0060) followed by any Unicode character

Описание:

Переменные подробно рассматриваются в разделе (§5). Переменная $? обсуждается в §2.3.2.2. Области рассматриваются в §3.5.

Переменные $$ и $^ зарезервированы для использования в интерактивной среде, которая находится за пределами этой спецификации.

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

$totalCost
$Maximum_Count_26

$végösszeg # Hungarian
$итог # Russian
$総計 # Japanese (Kanji)

${Maximum_Count_26}
${Name with`twhite space and `{punctuation`}}
${E:\\File.txt}

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

Существует несколько различных типов переменных: определяемые пользователем (§2.3.2.1), автоматически (§2.3.2.2) и предпочтения (§2.3.2.3). Все они могут сосуществовать в одной области (§3.5).

Рассмотрим следующее определение и вызовы функции:

function Get-Power ([long]$Base, [int]$Exponent) { ... }

Get-Power 5 3 # $Base is 5, $Exponent is 3
Get-Power -Exponent 3 -Base 5 # " " "

Каждый аргумент передается по позиции или имени по одному за раз. Однако набор аргументов можно передать как группу с расширением отдельных аргументов, обрабатываемых средой выполнения. Это автоматическое расширение аргументов называется расплескивание. Например

$values = 5,3 # put arguments into an array
Get-Power @values

$hash = @{ Exponent = 3; Base = 5 } # put arguments into a Hashtable
Get-Power @hash

function Get-Power2 { Get-Power @args } # arguments are in an array

Get-Power2 -Exponent 3 -Base 5 # named arguments splatted named in
@args
Get-Power2 5 3 # position arguments splatted positionally in @args

Это достигается с помощью @ вместо $ в качестве первого символа передаваемой переменной. Это нотация может использоваться только в аргументе команды.

Имена секционируются в различные пространства имен, каждый из которых хранится на виртуальном диске (§3.1). Например, переменные хранятся в Variable:, переменные среды хранятся в Env:, функции хранятся в Function:, а псевдонимы хранятся в Alias:. Все эти имена можно получить в виде переменных с помощью пространства имен переменных в ходе формирования внутри области видимости переменных . Например

function F { "Hello from F" }
$Function:F # invokes function F

Set-Alias A F
$Alias:A # invokes function F via A

$Count = 10
$Variable:Count # accesses variable Count
$Env:PATH # accesses environment variable PATH

Любое использование имени переменной с явным пространством имен Variable: эквивалентно использованию этого же имени переменной без этого указания. Например, $v и $Variable:v взаимозаменяемы.

Кроме того, в языке переменные также могут быть определены командлетом New-Variable.

2.3.2.1 Определяемые пользователем переменные

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

Определяемые пользователем переменные создаются и управляются пользовательским скриптом.

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

Автоматические переменные хранят сведения о состоянии среды PowerShell. Их значения можно считывать в написанном пользователем скрипте, но не записано.

Заметка

Таблица, первоначально найденная в этом документе, была удалена для уменьшения дублирования. Полный список автоматических переменных см. в about_Automatic_Variables.

2.3.2.3 Переменные предпочтений

Переменные предпочтений хранят настройки пользователя для сеанса. Они создаются и инициализированы средой выполнения PowerShell. Их значения можно считывать и записывать в написанный пользователем скрипт.

Заметка

Таблица, первоначально найденная в этом документе, была удалена для уменьшения дублирования. Полный список переменных предпочтений см. в about_Preference_Variables.

Команды 2.3.3

Синтаксис:

generic-token:
    generic-token-parts

generic-token-parts:
    generic-token-part
    generic-token-parts generic-token-part

generic-token-part:
    expandable-string-literal
    verbatim-here-string-literal
    variable
    generic-token-char

generic-token-char:
    Any Unicode character except
        {   }   (   )   ;   ,   |   &   $
        ` (The backtick character U+0060)
        double-quote-character
        single-quote-character
        whitespace
        new-line-character
        escaped-character

generic-token-with-subexpr-start:
    generic-token-parts $(

Параметры 2.3.4

Синтаксис:

command-parameter:
    dash first-parameter-char parameter-chars colon~opt~

first-parameter-char:
    A Unicode character of classes Lu, Ll, Lt, Lm, or Lo
    _ (The underscore character U+005F)
    ?

parameter-chars:
    parameter-char
    parameter-chars parameter-char

parameter-char:
    Any Unicode character except
        { } ( ) ; , \| & . [
        colon
        whitespace
        new-line-character

colon:
    : (The colon character U+003A)

verbatim-command-argument-chars:
    verbatim-command-argument-part
    verbatim-command-argument-chars verbatim-command-argument-part

verbatim-command-argument-part:
    verbatim-command-string
    & non-ampersand-character
    Any Unicode character except
        |
        new-line-character

non-ampersand-character:
    Any Unicode character except &

verbatim-command-string:
    double-quote-character non-double-quote-chars
    double-quote-character

non-double-quote-chars:
    non-double-quote-char
    non-double-quote-chars non-double-quote-char

non-double-quote-char:
    Any Unicode character except
        double-quote-character

Описание:

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

Существует три типа аргумента:

  • Параметр переключения (§8.10.5) имеет вид команда-параметр, где первый-символ-параметра и символы-параметра вместе составляют имя переключателя, которое соответствует имени параметра (без его ведущих -) в вызываемой команде. Если опущено конечное двоеточие, этот аргумент указывает, что соответствующий параметр должен иметь значение $true. Если конечное двоеточие присутствует, аргумент, непосредственно следующий за ним, должен обозначать значение типа bool, и соответствующий параметр устанавливается на это значение. Например, следующие вызовы эквивалентны:

    Set-MyProcess -Strict
    Set-MyProcess -Strict: $true
    
  • Параметр с аргументом (§8.10.2) — это формула команды-параметра, где первый символ параметра и символы параметра вместе составляют имя параметра, соответствующее имени параметра (без его начального символа -) в вызываемой команде. Не должно быть конечного двоеточия. Аргумент, следующий непосредственно, указывает связанное значение. Например, учитывая команду Get-Power, которая имеет параметры $Base и $Exponent, следующие вызовы эквивалентны:

    Get-Power -Base 5 -Exponent 3
    Get-Power -Exponent 3 -Base 5
    
  • Позиционный аргумент (§8.10.2) — аргументы и соответствующие параметры внутри команд располагаются по своим позициям, при этом первая позиция имеет номер ноль. Аргумент в позиции 0 привязан к параметру в позиции 0; аргумент в позиции 1 привязан к параметру в позиции 1; и т. д. Например, при указании команды Get-Power, которая имеет параметры $Base и $Exponent в позициях 0 и 1 соответственно, следующая команда вызывает следующую команду:

    Get-Power 5 3
    

Дополнительные сведения о специальных параметрах и см. в §8.2.

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

Сведения о привязке параметров см. в §8.14.

2.3.5 Литералы

Синтаксис:

literal:
    integer-literal
    real-literal
    string-literal

2.3.5.1 Числовые литералы

Существует два типа числовых литералы: целое число (§2.3.5.1.1) и реальные (§2.3.5.1.2). Оба могут иметь суффиксы умножения (§2.3.5.1.3).

2.3.5.1.1 Целочисленные литералы

Синтаксис:

integer-literal:
    decimal-integer-literal
    hexadecimal-integer-literal

decimal-integer-literal:
    decimal-digits numeric-type-suffix~opt~ numeric-multiplier~opt~

decimal-digits:
    decimal-digit
    decimal-digit decimal-digits

decimal-digit: one of
    0  1  2  3  4  5  6  7  8  9

numeric-type-suffix:
    long-type-suffix
    decimal-type-suffix

hexadecimal-integer-literal:
    0x hexadecimal-digits long-type-suffix~opt~
    numeric-multiplier~opt~

hexadecimal-digits:
    hexadecimal-digit
    hexadecimal-digit decimal-digits

hexadecimal-digit: one of
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

long-type-suffix:
    l

numeric-multiplier: one of
    kb mb gb tb pb

Описание:

Тип целочисленного литерала определяется его значением, наличием или отсутствием суффикса длинного типа, а также наличием числового множителя (§2.3.5.1.3).

Для целочисленного литерала без суффикса длинного типа

  • Если его значение может быть представлено типом int (§4.2.3), то это его тип;
  • В противном случае, если его значение может быть представлено типом long (§4.2.3), то это его тип.
  • В противном случае, если его значение может быть представлено десятичным типом (§2.3.5.1.2), то это его тип.
  • В противном случае он представлен двойным типом (§2.3.5.1.2).

Для литерала целого числа с суффиксом длинного типа

  • Если его значение может быть представлено типом long (§4.2.3), то это его тип;
  • В противном случае этот литерал некорректно сформирован.

В двухсоставном представлении целых значений существует еще одно отрицательное значение, чем положительное. Для типа int это дополнительное значение равно -2147483648. Для длинного типа это дополнительное значение равно -9223372036854775808. Несмотря на то, что маркер 2147483648 обычно рассматривается как литерал типа long, если ему немедленно предшествует унарный оператор "-", этот оператор и литерал трактуются как литерал типа int с наименьшим значением. Аналогичным образом, хотя токен 9223372036854775808 обычно рассматривается как вещественный литерал типа десятичный, если он сразу предшествует унарному оператору -, этот оператор и литерал рассматриваются как литерал типа long, имеющего наименьшее значение.

Некоторые примеры целых литералов: 123 (int), 123L (long) и 200000000000 (long).

Нет такой вещи, как целый литерал типа байт.

2.3.5.1.2 Реальные литералы

Синтаксис:

real-literal:
    decimal-digits . decimal-digits exponent-part~opt~ decimal-type-suffix~opt~ numeric-multiplier~opt~
    . decimal-digits exponent-part~opt~ decimal-type-suffix~opt~ numeric-multiplier~opt~
    decimal-digits exponent-part decimal-type-suffix~opt~ numeric-multiplier~opt~

exponent-part:
    e sign~opt~  decimal-digits

sign: one of
    +
    dash

decimal-type-suffix:
    d
    l

numeric-multiplier: one of
    kb mb gb tb pb

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Описание:

Реальный литерал может содержать числовой множитель (§2.3.5.1.3).

Существует два типа реальных литерала: двойные и десятичные. Они определяются отсутствием или наличием соответственно суффикса десятичного типа . (Нет такой вещи, как литерал с плавающей точкой .)

Двойный реальный литерал имеет тип double (§4.2.4.1). Десятичный реальный литерал имеет тип десятичного (§4.2.4.2). Конечные нули в дробной части десятичного числового литерала являются значимыми.

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

Некоторые примеры двойных реальных литералей: 1., 1.23, .45e35, 32.e+12 и 123.456E-231.

Некоторые примеры десятичных реальных литералей : 1d (с масштабом 0), 1,20d (который имеет масштаб 2), 1.23450e1d (т. е. 12.3450, который имеет масштаб 4), 1,2345e3d (т. е. 1234.5, который имеет масштаб 1), 1.2345e-1d (т. е. 0,12345, который имеет масштаб 5), и 1,2345e-3d (т. е. 0,0012345, который имеет масштаб 7).

Заметка

Поскольку вещественный литерал двойной точности не должен иметь дробную или экспонентную часть, группировка круглых скобок в (123).M необходима для того, чтобы свойство или метод M были выбраны для целочисленного объекта, значение которого равно 123. Без этих скобок реальный литерал будет плохо сформирован.

Заметка

Хотя в PowerShell нет литералов для бесконечности и NaN, эквиваленты вещественных литералов типа double можно получить из статических свойств только для чтения PositiveInfinity, NegativeInfinity и NaN типов float и double (§4.2.4.1).

Грамматика позволяет тому, что начинается как двойной реальный литерал, иметь суффикс l или L. Такой токен — это действительно целочисленный литерал, значение которого представлено типом long.

Заметка

Эта функция была сохранена для обратной совместимости с более ранними версиями PowerShell. Однако программистам не следует использовать литералы целых чисел этой формы, так как они могут легко скрыть их фактическое значение. Например, 1.2L имеет значение 1, 1.2345e1L имеет значение 12, а 1.2345e-5L имеет значение 0, ни одно из которых немедленно не очевидно.

Суффиксы-множители

Синтаксис:

numeric-multiplier: *one of*
    kb mb gb tb pb

Описание:

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

множитель значение пример
КБ килобайт (1024) 1 кб ≡ 1024
Мб мегабайт (1024 x 1024) 1.30Dmb ≡ 1363148.80
Гб gigabyte (1024 x 1024 x 1024) 0x10Gb ≡ 17179869184
туберкулёз теребайт (1024 x 1024 x 1024 x 1024) 1.4e23tb ≡ 1.5393162788864E+35
пб petabyte (1024 x 1024 x 1024 x 1024 x 1024 x 1024) 0x12Lpb ≡ 20266198323167232

2.3.5.2 Строковые литералы

Синтаксис:

string-literal:
    expandable-string-literal
    expandable-here-string-literal
    verbatim-string-literal
    verbatim-here-string-literal

expandable-string-literal:
    double-quote-character expandable-string-characters~opt~  dollars~opt~ double-quote-character

double-quote-character:
    " (U+0022)
    Left double quotation mark (U+201C)
    Right double quotation mark (U+201D)
    Double low-9 quotation mark (U+201E)

expandable-string-characters:
      expandable-string-part
      expandable-string-characters
      expandable-string-part

expandable-string-part:
    Any Unicode character except
        $
        double-quote-character
        ` (The backtick character U+0060)
    braced-variable
    $ Any Unicode character except
        (
        {
        double-quote-character
        ` (The backtick character U+0060)*
    $ escaped-character
    escaped-character
    double-quote-character double-quote-character

dollars:
    $
    dollars $

expandable-here-string-literal:
    @  double-quote-character  whitespace~opt~  new-line-character
        expandable-here-string-characters~opt~  new-line-character  double-quote-character  @

expandable-here-string-characters:
    expandable-here-string-part
    expandable-here-string-characters  expandable-here-string-part

expandable-here-string-part:
    Any Unicode character except
        $
        new-line-character
    braced-variable
    $ Any Unicode character except
        (
        new-line-character
    $ new-line-character  Any Unicode character except double-quote-char
    $ new-line-character double-quote-char  Any Unicode character except @
    new-line-character  Any Unicode character except double-quote-char
    new-line-character double-quote-char  Any Unicode character except @

expandable-string-with-subexpr-start:
    double-quote-character  expandable-string-chars~opt~  $(

expandable-string-with-subexpr-end:
    double-quote-char

expandable-here-string-with-subexpr-start:
    @  double-quote-character  whitespace~opt~  new-line-character  expandable-here-string-chars~opt~  $(

expandable-here-string-with-subexpr-end:
    new-line-character  double-quote-character  @

verbatim-string-literal:
    single-quote-character verbatim-string-characters~opt~ single-quote-char

single-quote-character:
    ' (U+0027)
    Left single quotation mark (U+2018)
    Right single quotation mark (U+2019)
    Single low-9 quotation mark (U+201A)
    Single high-reversed-9 quotation mark (U+201B)

verbatim-string-characters:
    verbatim-string-part
    verbatim-string-characters verbatim-string-part

verbatim-string-part:
    *Any Unicode character except* single-quote-character
    single-quote-character  single-quote-character

verbatim-here-string-literal:
    @ single-quote-character whitespace~opt~  new-line-character
        verbatim-here-string-characters~opt~  new-line-character
            single-quote-character *@*

verbatim-*here-string-characters:
    verbatim-here-string-part
    verbatim-here-string-characters  verbatim-here-string-part

verbatim-here-string-part:
    Any Unicode character except* new-line-character
    new-line-character  Any Unicode character except single-quote-character
    new-line-character  single-quote-character  Any Unicode character except @

Описание:

Существует четыре типа строковых литерала:

  • строкового литерала (однострочного, обозначенного одиночными кавычками), который представляет собой последовательность символов, длина которой может быть нулевой или более, ограниченную парой одиночных кавычек. Примерами являются '' и "красный".

  • расширяемый строковый литерал (однострочный в двойных кавычках), который представляет собой последовательность нулевых или более символов, разделенных парой двойных кавычекs. Примерами являются "" и "красный".

  • verbatim-here-string-литерал (многострочная одинарная кавычка), который представляет собой последовательность нулевых или более символов, ограниченных парами символов @одиночная кавычка и одиночная кавычка@, соответственно, все содержащиеся в двух или более исходных строках. Ниже приведены примеры.

    @'
    '@
    
    @'
    line 1
    '@
    
    @'
    line 1
    line 2
    '@
    
  • расширяемый строковый литерал (многострочный, заключенный в двойные кавычки), который представляет собой последовательность из нуля или более символов, ограниченных парами символов @двойная кавычка и двойная кавычка@, соответственно, все содержащиеся в двух или более исходных строках. Ниже приведены примеры.

    @"
    "@
    
    @"
    line 1
    "@
    
    @"
    line 1
    line 2
    "@
    

Для verbatim-here-string-literalи expandable-here-string-literal, за исключением пробелов (которые игнорируются), символы не могут следовать в той же строке исходного кода, что и открывающая пара символов-разделителей, и никакие символы не могут предшествовать в той же строке исходного кода, что и закрывающая пара символов-разделителей.

Текст -string-литерал или расширяемый строковый литеральный начинается в начале первой исходной строки после открывающего разделителя и заканчивается в конце последней исходной строки перед закрывающим разделителем. Тело может быть пустым. Символ конца строки в исходной строке перед закрывающим разделителем не является частью тела этого литерала.

Литерал любого из этих видов имеет строку типа (§4.3.1).

Символ, используемый для разделителя строкового литерала или расширяемого строкового литерала можно содержать в таком строковом литерале, написав этот символ дважды в последовательности. Например, 'What''s the time?' и "I said, ""Hello"".". Однако символа одинарной кавычки не имеет специального значения внутри расширяемого строкового литерала, а символа двойной кавычки не имеет специального значения внутри дословного строкового литерала.

расширяемый строковый литерал и расширяемый здесь-строковый литерал могут содержать экранированные символы(§2.3.7). Например, если в конвейер записывается следующий строковый литерал, результат будет следующим:

"column1`tcolumn2`nsecond line, `"Hello`", ```Q`5`!"
column1<horizontal-tab>column2<new-line>
second line, "Hello", `Q5!

Если расширяемый строковый литерал или expandable-here-string-literal содержит имя переменной, если только это имя не предшествует escape-символу, оно заменяется строковым представлением значения этой переменной (§6.7). Это называется подстановкой переменных.

Заметка

Если имя переменной является частью какого-то большего выражения, заменится только имя переменной. Например, если $a является массивом, содержащим элементы 100 и 200, ">$a.Length<" приводит к >100 200.Length< в то время как ">$($a.Length)<" приводит к >2<. См. расширение вложенных выражений ниже.

Например, исходный код

$count = 10
"The value of `$count is $count"

приводит к расширяемым строковым литералам

The value of $count is 10.

Рассмотрим следующее:

$a = "red","blue"
"`$a[0] is $a[0], `$a[0] is $($a[0])" # second [0] is taken literally

Результат заключается в том, что

$a[0] is red blue[0], $a[0] is red

расширяемые строковые литералыи расширяемые литералы типа "here-string"также поддерживают метод подстановки, называемый расширением подвыражений, учитывая текст формы $( ... ) как подвыражение (§7.1.6). Такой текст заменяется строковым представлением значения этого выражения (§6.8). Все пробелы, используемые для разделения маркеров в вложенных выражений инструкций, игнорируются в том случае, если речь идет о построении строки результата.

Примеры

$count = 10
"$count + 5 is $($count + 5)"
"$count + 5 is `$($count + 5)"
"$count + 5 is `$(`$count + 5)"

приводит к следующему расширяемому строковому литералуs:

10 + 5 is 15
10 + 5 is $(10 + 5)
10 + 5 is $($count + 5)

Следующий источник:

$i = 5; $j = 10; $k = 15
"`$i, `$j, and `$k have the values $( $i; $j; $k )"

приводит к следующему расширяемому строковому литералу:

$i, $j, and $k have the values 5 10 15

Эти четыре строки могли бы быть написаны более кратко, как показано ниже:

"`$i, `$j, and `$k have the values $(($i = 5); ($j = 10); ($k = 15))"

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

"First 10 squares: $(for ($i = 1; $i -le 10; ++$i) { "$i $($i*$i) " })"

Результирующий расширяемый строковый литерал выглядит следующим образом:

First 10 squares: 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100

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

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

$a = 10
$s1 = "`$a = $($a; ++$a)"
"`$s1 = >$s1<"
$s2 = "`$a = $($a; ++$a)"
"`$s2 = >$s2<"
$s2 = $s1
"`$s2 = >$s2<"

это приводит к следующему расширяемому строковому литералу:

$s1 = >$a = 10<
$s2 = >$a = 11<
$s2 = >$a = 10<

Содержимое verbatim-here-string-литерала воспринимается дословно, включая любые начальные или конечные пробелы в тексте. Таким образом, встроенные одиночные кавычки не нуждаются в удвоении, и не происходит подстановки или расширения. Например

$lit = @'
That's it!
2 * 3 = $(2*3)
'@

что приводит к буквальному значению

That's it!
2 * 3 = $(2*3)

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

$lit = @"
That's it!
2 * 3 = $(2*3)
"@

это приводит к следующему литералу при расширении:

That's it!
2 * 3 = 6

Для обоих verbatim-here-строковых литералови расширяемых here-строковых литераловкаждый строковый терминатор в теле представлен в результирующем литерале в форме, определенной реализацией. Например, в

$lit = @"
abc
xyz
"@

вторая строка тела имеет два ведущих пробела, а первая и вторая строки тела имеют концевые символы; однако концевой символ для второй строки тела - , а не, частью этого тела. Результирующий литерал эквивалентен: "abc<implementation-defined character sequence>xyz".

Заметка

Чтобы обеспечить читаемость источника, длинные строковые литералы можно разбить на несколько строк исходного кода без вставки конца строки. Это делается путем записи каждой части как отдельного литерала и объединения частей с помощью оператора + (§7.7.2). Этот оператор позволяет операндам назначать любой из четырех видов строкового литерала.

Заметка

Хотя в строгом смысле не существует такого понятия, как символьный литерал, тот же эффект может быть достигнут путем доступа к первому символу в однобуквенной строке, как показано ниже: [char]"A" или "A"[0].

Для обоих видов verbatim-here-string-литералови expandable-here-string-литералов, каждый разделитель строк в теле текста представлен в точности так, как они были заданы.

2.3.5.3 Нулевой литерал

См. автоматическую переменную $null (§2.3.2.2).

2.3.5.4 Логические литералы

См. автоматические переменные $false и $true (§2.3.2.2).

2.3.5.5 Литералы массива

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

2.3.5.6 Хэш-литералы

PowerShell позволяет писать выражения типа Hashtable (§10) с помощью хэш-литерального выражения (§7.1.9)

2.3.5.7 Имена типов

Синтаксис:

type-name:
    type-identifier
    type-name . type-identifier

type-identifier:
    type-characters

type-characters:
    type-character
    type-characters type-character

type-character:
    A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nd
    _ (The underscore character U+005F)

array-type-name:
    type-name [

generic-type-name:
    type-name [

2.3.6 Операторы и пунктуаторы

Синтаксис:

operator-or-punctuator: one of
    {   }   [   ]   (   )   @(   @{   $(   ;
    &&  ||  &   |   ,   ++  ..   ::   .
    !   *   /   %   +   -   --
    -and   -band   -bnot   -bor
    -bxor   -not   -or     -xor
    assignment-operator
    merging-redirection-operator
    file-redirection-operator
    comparison-operator
    format-operator

assignment-operator: one of
    =  -=  +=  *=  /=  %=

file-redirection-operator: one of
    >  >>  2>  2>>  3>  3>>  4>  4>>
    5>  5>>  6>  6>>  *>  *>>  <

merging-redirection-operator: one of
    *>&1  2>&1  3>&1  4>&1  5>&1  6>&1
    *>&2  1>&2  3>&2  4>&2  5>&2  6>&2

comparison-operator: *one of
    -as           -ccontains      -ceq
    -cge          -cgt            -cle
    -clike        -clt            -cmatch
    -cne          -cnotcontains   -cnotlike
    -cnotmatch    -contains       -creplace
    -csplit       -eq             -ge
    -gt           -icontains      -ieq
    -ige          -igt            -ile
    -ilike        -ilt            -imatch
    -in           -ine            -inotcontains
    -inotlike     -inotmatch      -ireplace
    -is           -isnot          -isplit
    -join         -le             -like
    -lt           -match          -ne
    -notcontains  -notin         -notlike
    -notmatch     -replace       -shl*
    -shr          -split

format-operator:
    -f

Описание:

&& и || зарезервированы для дальнейшего использования.

Заметка

Примечание редактора. Операторы цепочки конвейеров && и || появились в PowerShell 7. См. about_Pipeline_Chain_Operators.

Имя, следующее за - в операторе, зарезервировано исключительно для этого в контексте оператора.

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

2.3.7 Экранированные символы

Синтаксис:

escaped-character:
    ` (The backtick character U+0060) followed by any Unicode character

Описание:

экранируемый символ — это способ назначения специальной интерпретации символу, предоставив ему префикс Backtick (U+0060). В следующей таблице показано значение каждого экранированного символа:

Экранированный символ Значение
`a Оповещение (U+0007)
`b Backspace (U+0008)
`f Подача страницы (U+000C)
`n Новая строка (U+000A)
`r Возврат каретки (U+000D)
`t Горизонтальная вкладка (U+0009)
`v Вертикальная вкладка (U+0009)
`' Одна кавычка (U+0027)
`" Двойная кавычка (U+0022)
`` Backtick (U+0060)
`0 NUL (U+0000)
`x Если x - это символ, отличный от указанных выше символов, то обратная кавычка игнорируется и x принимается буквально.

Смысл последней записи в таблице выше заключается в том, что пробелы, которые в противном случае разделяли бы токены, можно вместо этого сделать частью токена. Например, имя файла, содержащее пробел, можно записать как Test` Data.txt (а также 'Test Data.txt' или "Test Data.txt").