В cmd \
не выходит "
. Вот быстрое доказательство и объяснение:
Запустить echo "" & echo 1
. (&
- это специальный символ в cmd, left & right
означает, что бегите left
затем бегите right
.) Мы видим, что как echo ""
и echo 1
выполнены успешно.
Далее запустите echo " & 1234
. Мы можем видеть, что результат " & 1234
. Это потому, что открытие "
не было закрыто, и, следовательно, все после него интерпретируется как строка, включая специальный символ &
.
Запустите echo "\" & 1234
.
Если \
действительно экранирует следующее "
, открытие "
не будет закрыто, а символы & 1234
будут интерпретироваться как часть строки.
Если \
не удается избежать следующего "
, то следующее "
закроет строку и & 1234
не будет интерпретироваться как часть строки.
В выводе мы не видим & 1234
интерпретируемый как часть строки. Это доказывает, что \
не удалось сбежать "
.
Так что же "ускользает "
в кавычках для передачи аргументов? Хотя ^
будет работать вне кавычек (это легко проверить с помощью echo ^" & echo 1
), он не экранирует кавычки внутри кавычек.
Действительно, как мы можем заставить что-то простое, например, echo """
&
echo 1
работать?
^
Символ? ...Нет, echo "^"" & echo 1
выводит "^""
, а не """
.
А как насчет "
себя? ...Нет, echo """" & echo 1
выводит """"
, а не """
.
Дело в том, что нет ничего , что убежит "
кавычки для передачи аргументов. Вы можете размышлять над этим в течение пары лет и не найти решения. Это лишь некоторые из ограничений, присущих сценариям cmd.
Тем не менее, хорошая новость заключается в том, что вы, скорее всего, никогда не столкнетесь с ситуацией, когда вам нужно это сделать. Конечно, нет никакого способа заставить echo """
&
echo 1
работать, но это не так уж важно, потому что это просто надуманная проблема, с которой вы, вероятно, никогда не столкнетесь.
Например, рассмотрим runas
. Он работает нормально, без необходимости убегать "
в кавычках, потому что runas
знал, что это невозможно сделать, и сделал внутренние корректировки, чтобы обойти его. runas
изобрел свои собственные правила синтаксического анализа (runas /flag "anything even including quotes"
) и не интерпретирует CMD аргументы обычным способом. Официальная документация для этого специального синтаксиса довольно скудна (или вообще отсутствует). Помимо /?
и help
, это в основном методом проб и ошибок.