экранирование строки в командной строке Windows - PullRequest
3 голосов
/ 23 февраля 2011

Я пытаюсь передать строку в программу Win32 из командной строки, чтобы она была напечатана без изменений.

Почему я должен сбежать
"AAA " как "" "AAA " ""
но
"AAA ", (включая запятую) как "\" AAA ^ \ ","

Я не вижу последовательности в экранировании правил для командной строки Windows

P.S. Я пытаюсь создать файл .cmd

Обновление:

Я использую простую программу на C для тестирования, которая скомпилирована с gcc, никаких дополнительных объектных файлов не связано. Если я заменю его на perl, правила останутся прежними.

Я пытаюсь создать общий алгоритм побега. Он сгенерирует файл .cmd, который вызовет perl с перенаправлением вывода. В настоящее время у меня есть проблема, что если строка содержит нечетное число двойных кавычек, которые экранируются с помощью обратной косой черты, перенаправление вывода не работает. Та же проблема описана в последнем комментарии к http://blogs.msdn.com/b/oldnewthing/archive/2010/09/17/10063629.aspx.

Если я использую "" в качестве escape для ", он разделяется на пробел, поэтому он приводит к двум параметрам вместо одного. Также" "имеет некоторые артефакты.

Ответы [ 2 ]

7 голосов
/ 23 февраля 2011

В Windows нет единого способа получить командную строку и проанализировать ее. В основном программы оставлены для того, чтобы справиться с этим самим.

В недавнем посте Раймонда Чена о функции CommandLineToArgvW упоминаются различные правила цитирования, но они применяются только в том случае, если программа использует эту конкретную функцию. http://blogs.msdn.com/b/oldnewthing/archive/2010/09/17/10063629.aspx

В окнах командная строка передается программе без изменений (т. Е. Без подстановочных знаков), а затем программе необходимо с ней справиться. Язык программирования может обеспечить удобство, которое выполняет некоторый синтаксический анализ по умолчанию, и для этого может использоваться стандартная функция Windows, такая как CommandLineToArgvW , но даже в этом случае программа может выбрать чтение самой неподтвержденной строки, пропуская эти стандарты.

Это означает, что вам нужно выяснить правила для конкретной программы, которую вы пытаетесь написать самостоятельно, а затем использовать их.

1 голос
/ 23 февраля 2011

Я только что попробовал эти параметры в качестве одной из моих собственных программ, и обе версии (с запятой или без нее) можно экранировать обоими способами (используя """ или \" для экранирования кавычек).Единственная причина, по которой я вижу, что < и > нужно экранировать с помощью ^ во второй версии, заключается в том, что, поскольку командная строка рассматривает их как перенаправления ввода-вывода перед передачей их приложению, из-зак другому способу избежать строковых кавычек.

...