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


Сведения о синтаксическом анализе

КРАТКОЕ ОПИСАНИЕ

Описывает, как PowerShell анализирует команды.

ПОДРОБНОЕ ОПИСАНИЕ

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

Например, если ввести:

Write-Host book

PowerShell разбивает команду на два маркера, Write-Host и , и bookинтерпретирует каждый маркер независимо, используя один из двух основных режимов анализа: режим выражения и режим аргументов.

Примечание

При анализе входных данных команды PowerShell пытается разрешить имена команд в командлеты или собственные исполняемые файлы. Если имя команды не имеет точного совпадения, PowerShell добавляет Get- команду в качестве команды по умолчанию. Например, PowerShell анализирует как ProcessGet-Process. Не рекомендуется использовать эту функцию по следующим причинам:

  • Это неэффективно. Это приводит к тому, что PowerShell выполняет поиск несколько раз.
  • Внешние программы с тем же именем разрешаются в первую очередь, поэтому вы не можете выполнить нужный командлет.
  • Get-Help и Get-Command не распознают имена без глаголов.

Режим выражения

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

Литеральные выражения являются прямыми представлениями их значений:

'hello', 32

Выражения переменных несут значение переменной, на которые они ссылаются:

$x, $script:path

Операторы объединяют другие выражения для вычисления:

- 12, -not $Quiet, 3 + 7, $input.Length -gt 1
  • Символьные строковые литералы должны содержаться в кавычках.
  • Числа обрабатываются как числовые значения, а не как ряд символов (если они не экранированы).
  • Операторы, включая унарные операторы, такие как - и и -not , и бинарные операторы, такие как + и -gt, интерпретируются как операторы и применяют соответствующие операции к своим аргументам (операндам).
  • Выражения атрибутов и преобразований анализируются как выражения и применяются к подчиненным выражениям, например [int] '7'.
  • Ссылки на переменные вычисляются по их значениям, но сплаттинг (т. е. вставка предварительно заполненных наборов параметров) запрещен и вызывает ошибку средства синтаксического анализа.
  • Все остальное будет рассматриваться как вызываемая команда.

Режим аргументов

При анализе PowerShell сначала интерпретирует входные данные как выражение. Но при обнаружении вызова команды синтаксический анализ продолжается в режиме аргументов.

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

  • Знак доллара ($) начинает ссылку на переменную (только если за ней следует допустимое имя переменной, в противном случае она интерпретируется как часть расширяемой строки).
  • Кавычки (' и ") начинают строковые значения
  • Круглые скобки (( и )) обозначают новые выражения.
  • Оператор subexpression ($(...)) демаркирует внедренные выражения.
  • Фигурные скобки ({ и }) обозначают новые блоки скриптов.
  • Initial at sign (@) — начинает синтаксис выражений, например splatting (@args), массивы (@(1,2,3)) и хэш-таблицы (@{a=1;b=2}).
  • Запятые (,) представляют списки, передаваемые в виде массивов, за исключением случаев, когда вызываемая команда является собственным приложением. В этом случае они интерпретируются как часть расширяемой строки. Начальные, последовательные или конечные запятые не поддерживаются.

Значения внедренных выражений преобразуются в строки.

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

Пример Режим Результат
2 Выражение 2 (целое число)
`2 Expression "2" (команда)
echo 2 Expression 2 (целое число)
2+2 Expression 4 (целое число)
echo 2+2 Аргумент "2+2" (строка)
echo(2+2) Expression 4 (целое число)
$a Expression 4 (целое число)
echo $a Expression 4 (целое число)
$a+2 Expression 6 (целое число)
echo $a+2 Аргумент 4+2 (строка)
$- Аргумент "$-" (команда)
echo $- Аргумент "$-" (строка)
a$a Expression "a$a" (команда)
echo a$a Аргумент "a4" (строка)
a'$a' Expression "a$a" (команда)
echo a'$a' Аргумент "a$a" (строка)
a"$a" Expression "a$a" (команда)
echo a"$a" Аргумент "a4" (строка)
a$(2) Expression "a$(2)" (команда)
echo a$(2) Аргумент "a2" (строка)

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

Пример Режим Результат
Write-Output !1 — аргумент "!1" (строка)
Write-Output (!1) expression False (логическое значение)
Write-Output (2) expression 2 (целое число)
Set-Variable AB A,B — аргумент "A", "B" (массив)
CMD /CECHO A,B — аргумент "A,B" (строка)
CMD /CECHO $AB expression "A", "B" (массив)
CMD /CECHO :$AB — аргумент ":A B" (строка)

Символ остановки анализа (--%), представленный в PowerShell 3.0, предписывает PowerShell воздерживаться от интерпретации входных данных как команд или выражений PowerShell.

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

При обнаружении символа остановки синтаксического анализа PowerShell обрабатывает оставшиеся символы в строке как литерал. Единственная интерпретация, которую он выполняет, заключается в замене значений переменных среды, использующих стандартную нотацию Windows, например %USERPROFILE%.

Символ остановки синтаксического анализа действует только до следующей новой строки или символа конвейера. Нельзя использовать символ продолжения (`) для расширения его действия или разделитель команды (;) для прекращения его действия.

Например, следующая команда вызывает программу Icacls .

icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F

Чтобы выполнить эту команду в PowerShell 2.0, необходимо использовать escape-символы, чтобы предотвратить неправильное толкование круглых скобок в PowerShell.

icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F

Начиная с PowerShell 3.0, можно использовать символ остановки синтаксического анализа.

icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F

PowerShell отправляет следующую командную строку в программу Icacls :

X:\VMS /grant Dom\HVAdmin:(CI)(OI)F

Примечание

Символ остановки синтаксического анализа, предназначенный только для использования на платформах Windows.

СМ. ТАКЖЕ

about_Command_Syntax