2-й документ, цитируемый Питером Мортенсеном в его комментарии к ответу Кодесмита, прояснил мне ситуацию.Этот документ был написан 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 неэкранированная двойная кавычка инициирует переключение между двумяossible states.
Некоторые дальнейшие пробные версии и ошибки подразумевают, что в исходном состоянии перенаправление (в файл или канал) распознается, и символ каретки ^
экранирует двойную кавычку, и символ каретки удаляется из ввода.В другом состоянии перенаправление не распознается, и каретка не избегает двойной кавычки и не удаляется.Давайте назовем эти состояния «внешним» и «внутренним», соответственно.
Если вы хотите перенаправить вывод вашей команды, то командная оболочка должна быть в внешнем состоянии, когда она достигает перенаправления, поэтомуперед перенаправлением должно быть четное число двойных кавычек без экранирования (с помощью каретки).foo "a\"b " > out.txt
не будет работать - командная оболочка передает все "a\"b " > out.txt
в foo в качестве аргументов комбинированной командной строки, вместо передачи только "a\"b "
и перенаправления вывода на .txt .
foo "a\^"b " > out.txt
также не будет работать, потому что каретка ^
встречается во внутреннем состоянии, где это обычный символ, а не escape-символ, поэтому "a\^"b " > out.txt
получаетпередано foo .
Единственный способ, который (мы надеемся) всегда работает, - это всегда держать командную оболочку во внешнем состоянии, потому что тогда перенаправление работает.
Если выне нужно перенаправление (или других символов, имеющих особое значение для командной оболочки), тогда вы можете обойтись без карет.Если foo интерпретирует \"
как буквальную двойную кавычку, то вы можете назвать его как
foo "a\"b c"
Тогда foo получает "a\"b c"
в качестве комбинированного аргумента textи может интерпретировать его как один аргумент, равный a"b c
.
Теперь - наконец - к исходному вопросу.myscript '"test"'
, вызываемый из командной оболочки Windows, передает '"test"'
в myscript .Очевидно, myscript интерпретирует одинарные и двойные кавычки как разделители аргументов и удаляет их.Вам необходимо выяснить, что myscript принимает в качестве буквальной двойной кавычки, а затем указать это в своей команде, используя ^
для экранирования любых символов, которые имеют особое значение для командной оболочки Windows.Учитывая, что myscript
также доступен в Unix, возможно, \"
добивается цели.Попробуйте
myscript \^"test\^"
или, если вам не нужно перенаправление,
myscript \"test\"