Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Редакционная заметка
Важный
спецификация языка 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.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").