Почему конкретный пакетный параметр Windows вызывает сбой? - PullRequest
1 голос
/ 02 апреля 2012

Содержимое test.bat:

setlocal EnableExtensions EnableDelayedExpansion
set param1=%~1
echo %param1%

Может кто-нибудь объяснить, почему test.bat "^^!^^^&^^^^" вызывает сбой окна cmd, но test.bat "^^^&^^^^" имеет ожидаемый результат установки &^ в переменную param1?

Я могу сделать test.bat "pass^^!word" и получаю ожидаемый результат передачи! Word.

Обновление: test.bat "^^!^^^^^&^^^^^^^^" работает. Но я не совсем уверен, почему. Это интерпретируется как set param1=^!^^&^^^^. Почему ^ нужно ^^^ перед ним?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

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

Сначала в команде set фаза специальных символов уменьшит вашу строку "^^!^^^&^^^^" до
^!^&^^
Но так как расширение с задержкой включено, и ваша строка содержит восклицательный знак,
будет включена другая фаза, чтобы снова уменьшить количество карет до.
!&^

В этот момент param1 содержит !&^, вы можете проверить его с помощью set param1

Но когда вы попытаетесь отобразить значение с помощью echo %param1%, будет выполнено другое расширение.
И теперь у вас возникнет проблема: %param1% расширится до !&^,
Восклицательный знак будет удален,так как второй восклицательный знак отсутствует для расширения переменной,
амперсанд будет рассматриваться как новый разделитель команд и
конечный символ будет считаться многострочным символом.
echo ! & ^<next line>

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

setlocal EnableDelayedExpansion
set param1=%~1
set param1
echo !param1!

И все эти объяснения можно найти на Как CMD.EXE анализирует скрипты?

1 голос
/ 03 апреля 2012

Это потому, что escape-символ для оболочки Windows - ^, поэтому:

"^^! ^^^^^ & ^^^^^^^^"

Каждый ^^ становится ^

Каждый ^ & становится &

Итак, наконец, вы получите:

"^! ^^ & ^^^^"

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