Второй документ, процитированный Питером Мортенсеном в его комментарии к ответу Codesmith, дал мне много ясности. Этот документ был написан windowsinspired.com. Ссылка повторяется: лучший способ понять использование кавычек и экранирование аргументов командной строки Windows .
Дальнейшие методы проб и ошибок приводят к следующему руководству:
Избегайте двойных кавычек "
с помощью каретки ^
. Если вы хотите , чтобы другие символы со специальным значением для командной оболочки Windows , (например, <
, >
, |
, &
) должны интерпретироваться как обычные символы вместо этого, то избавиться от них с кареткой, тоже.
Если вы хотите, чтобы ваша программа foo получала текст командной строки "a\"b c" > d
и перенаправляла его вывод в файл out.txt , запустите вашу программу из командной оболочки Windows следующим образом:
foo ^"a\^"b c^" ^> d > out.txt
Если foo интерпретирует \"
как буквальные двойные кавычки и ожидает, что неэкранированные двойные кавычки будут разделять аргументы, содержащие пробелы, то foo интерпретирует команду как указание одного аргумента a"b c
, одного аргумента >
и одного аргумента d
.
Если вместо этого foo интерпретирует двойные двойные кавычки ""
как буквальные двойные кавычки, то запустите вашу программу как
foo ^"a^"^"b c^" ^> d > out.txt
Ключевой вывод из процитированного документа состоит в том, что для командной оболочки Windows неэкранированные двойные кавычки запускают переключение между двумя возможными состояниями.
Дальнейшие методы проб и ошибок предполагают, что в исходном состоянии перенаправление (к файлу или каналу) распознается, и каретка ^
экранирует двойные кавычки, а каретка удаляется из ввода. В другом состоянии перенаправление не распознается, и курсор не выходит за пределы двойных кавычек и не удаляется. Назовем эти состояния «внешними» и «внутренними» соответственно.
Если вы хотите перенаправить вывод своей команды, то при достижении перенаправления командная оболочка должна находиться во внешнем состоянии, поэтому перенаправлению должно предшествовать четное количество неэкранированных (с помощью каретки) двойных кавычек. foo "a\"b " > out.txt
не будет работать - командная оболочка передает все "a\"b " > out.txt
в foo в качестве своих объединенных аргументов командной строки, вместо того, чтобы передавать только "a\"b "
и перенаправлять вывод в out.txt .
foo "a\^"b " > out.txt
тоже не будет работать, потому что каретка ^
встречается во внутреннем состоянии, где это обычный символ, а не escape-символ, поэтому "a\^"b " > out.txt
передается в foo .
Единственный способ, который (надеюсь) всегда работает, - это всегда держать командную оболочку во внешнем состоянии, потому что тогда работает перенаправление.
Если вам не нужно перенаправление (или другие символы со специальным значением для командной оболочки), вы можете обойтись без каретки. Если foo интерпретируется \"
как буквальная двойная кавычка, вы можете назвать это как
foo "a\"b c"
Затем foo получает в "a\"b c"
качестве объединенных аргументов текст и может интерпретировать его как единственный аргумент, равный a"b c
.
Теперь, наконец, к исходному вопросу. myscript '"test"'
вызываемый из командной оболочки Windows, переходит '"test"'
к myscript . Очевидно, myscript интерпретирует одинарные и двойные кавычки как разделители аргументов и удаляет их. Вам нужно выяснить, что myscript принимает как буквальные двойные кавычки, а затем указать это в вашей команде, используя ^
для экранирования любых символов, которые имеют особое значение для командной оболочки Windows. Учитывая, что myscript
это также доступно в Unix, возможно \"
, это поможет. Пытаться
myscript \^"test\^"
или, если вам не нужно перенаправление,
myscript \"test\"
myscript \"test\"