Сведения о синтаксическом анализе
КРАТКОЕ ОПИСАНИЕ
Описывает, как PowerShell анализирует команды.
ПОДРОБНОЕ ОПИСАНИЕ
При вводе команды в командной строке PowerShell разбивает текст команды на ряд сегментов, называемых токенами , а затем определяет, как интерпретировать каждый маркер.
Например, если ввести:
Write-Host book
PowerShell разбивает команду на два маркера, Write-Host
и , и book
интерпретирует каждый маркер независимо, используя один из двух основных режимов анализа: режим выражения и режим аргументов.
Примечание
При анализе входных данных команды PowerShell пытается разрешить имена команд в командлеты или собственные исполняемые файлы. Если имя команды не имеет точного совпадения, PowerShell добавляет Get-
команду в качестве команды по умолчанию. Например, PowerShell анализирует как Process
Get-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.