Вопрос Использование обратной косой черты для удаления символов в cmd.exe (например, команда runas)


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

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

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

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


4
2017-08-30 09:40


происхождения




ответы:


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


4
2017-08-30 10:00



интересно .. и btw .. что делает cmd.exe с необразованными кавычками в конце? он держит их, если да, то почему .. Или он их убирает .. если да, то зачем они нужны в первую очередь? - barlop
@barlop: Смотрите Майкл ответ, - Dennis Williamson
вы уверены, что «интерпретируется runas, а не cmd.exe?» компилируя этот w.c pastebin.com/28Q2Wxxr  to w.exe Сравните a) w "a a" b) w \ a a \ c) w ^ a a ^ «Обратите внимание, что происходит с b в частности. Я предполагаю, что это CMD-оболочка, рассматривающая \ как escape-символ. - barlop
в то время как это не было cmd.exe, который интерпретировал его, это тоже не программа, это среда выполнения, которая разделяет аргументы. я не уверен, можно ли назвать эту программу свободной для ее реализации. больше похоже на способ реализации компилятора или способ, которым компилятор реализует его для программ. любые программы, написанные в i предположим, ms visual c, будут анализировать argsv "таким образом" msdn.microsoft.com/en-us/library/a1y7w461.aspx - barlop


В 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, это в основном пробная ошибка.


6
2017-08-26 01:33





\ знак интерпретирует интерпретатор следующего знака как персонаж вместо идентификатор,

Вы тоже много видите в коде:

"Hello \"World\""

это интерпретированы в виде

Hello "World"

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

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


3
2017-08-30 13:48



Мне кажется, что RunAs «нуждается» в котировках, когда этот второй параметр, параметр программы, имеет пробел. В противном случае он думает, что ему дают больше параметров, чем есть. Теоретически, руны могли быть написаны (я имею в виду кодированные), чтобы довести его до конца, поскольку один параметр не требует кавычек. В отличие от этого. cmd.exe, например. cmd / c dir a b Это принимает -dir a b- как один параметр. - barlop
Кроме того, более сложный момент, мне кажется, что runas мог бы обойтись без «Но не может, потому что он принимает« как начало и следующий »как конец. Если бы он просто занял самое большее, как начало и конец, тогда ему не нужны средние, чтобы быть ", например даже неприятная смотрящая строка, подобная этой: C: \> runas / user: Administrator "runas / user: Administrator \" cmd / k dir \ "% userprofile% \" \ "" Если бы все было "и нет", то теоретически вы все еще может его обработать. Но не так из-за того, как был записан runas. - barlop
@barlop: Не думай о cmd как аргумент для runas, потому что это не так. Аргументом для runas является cmd /k dir \"%userprofile%\", У меня сейчас нет времени, но дайте мне пару часов, и я смогу объяснить вам простую программу на C ++ и как эти программы интерпретируют аргументы. Я думаю, это было бы более ясно. Так, ответ, связанный с изменением - Default
На самом деле я могу понять и просто не ясно. Я знаю об основном методе и argsv. Я слышал, что они принимают все аргументы в своем первом элементе? это правильно? Относительно того, что я упоминаю cmd.exe, существует двусмысленность: я имею в виду cmd.exe в этой строке или outt cmd.exe, в котором написана строка. Единственный раз, когда я упомянул cmd.exe в том, что я написал в этих комментариях, был cmd / c dir ab И я прав, что -dir a b- 1 параметр. Но мне сказали (не знаю, правильно ли), что все программы Windows получают все свои аргументы как 1 строку, предположительно argsv [0], а затем разбивают ее сами - barlop
@ Майкл, если ты хочешь этого в Why Form .. Я мог бы спросить. Почему cmd / c dir a b интерпретируется как cmd / c «dir a b». В то время как с runas параметр программы (см. Runas /?) Требует кавычек. Я думаю, что runas можно было легко закодировать, чтобы не хотеть их. Поскольку мне кажется, что это теоретически, они не нужны. - barlop