5

Я вижу, что каретка - это задокументированный побег.

Но у меня есть пример, показывающий, что для символа двойной кавычки ^ не работает, и вы должны использовать \

C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""

Почему это и где это задокументировано?

3 ответа3

7

В cmd \ не выходит " . Вот быстрое доказательство и объяснение:

  1. Запустить echo "" & echo 1 . (& - это специальный символ в cmd, left & right означает, что бегите left затем бегите right .) Мы видим, что как echo "" и echo 1 выполнены успешно.

  2. Далее запустите echo " & 1234 . Мы можем видеть, что результат " & 1234 . Это потому, что открытие " не было закрыто, и, следовательно, все после него интерпретируется как строка, включая специальный символ & .

  3. Запустите 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 , это в основном методом проб и ошибок.

4

Один из примеров в RUNAS /? показывает этот синтаксис. Символ каретки является escape-символом для CMD.EXE но в Windows отдельные программы могут свободно реализовывать свои собственные escape-символы и глобализацию.

4

Знак \ заставляет интерпретатора интерпретировать следующий знак как символ вместо идентификатора.

Вы часто видите это в коде:

"Hello \"World\""

это интерпретируется как

Hello "World"

в вашем примере, чтобы передать аргументы в cmd , он должен быть заключен в "". Но так как аргументы к cmd содержат "(и это закончило бы приложение), они добавляются \ . Если бы "" там не было, то /k dir \"%userprofile%\" был бы интерпретирован как аргумент для runas , а не для cmd .

Причина, по которой они включают% userprofile%, заключается в том, что это переменная среды и будет заменена текстом, который может содержать пробелы, что (по той же причине, что и выше) может привести к неверному аргументу для cmd .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .