В Unix я мог работать myscript '"test"'
и получал "test"
.
В винде cmd
попадаю 'test'
.
Как передать в качестве параметра двойные кавычки? Я хотел бы знать, как сделать это вручную из cmd
окна, чтобы мне не пришлось писать программу для тестирования моей программы.
myscript \"test\"
Ответы:
Я не могу быстро воспроизвести симптомы: если я попытаюсь
myscript '"test"'
использовать командный файл,myscript.bat
содержащий только@echo.%1
или даже@echo.%~1
, я получаю все цитаты:'"test"'
Возможно, вы можете попробовать escape-символ
^
следующим образомmyscript '^"test^"'
:?источник
wscript
вина! Оставьте это в Windows :)cmd
.Другой способ избежать кавычек (хотя, вероятно, не предпочтительный), который, как я обнаружил, используется в определенных местах, - это использование нескольких двойных кавычек . Я объясню, чтобы сделать чужой код понятным.
Вот набор основных правил:
program param1 param2 param 3
будут проходить четыре параметраprogram.exe
:param1
,param2
,param
, и3
.program one two "three and more"
будет проходить три параметра вprogram.exe
:one
,two
, иthree and more
.hello"to the entire"world
действует как один параметр:helloto the entireworld
."Tim says, ""Hi!"""
будет действовать как один параметр:Tim says, "Hi!"
Таким образом, существует три различных типа двойных кавычек: открывающиеся кавычки, закрывающиеся кавычки и кавычки, которые действуют как обычный текст.
Вот разбивка этой последней запутанной строки:
Таким образом, текст фактически объединяет четыре группы символов (одна без каких-либо оберток):
Tim says,
это первая, заключенная в оболочку, чтобы избежать пробелов,"Hi!
вторая, безупаковки (нет пробелов), третья, группа в двойных кавычках, ничего не оборачивающая
"
это четвертая, развернутая закрытая цитата.Как видите, группа с двойными кавычками, ничего не оборачивающая, по-прежнему необходима, поскольку без нее следующая двойная кавычка открыла бы группу с двойными кавычками вместо того, чтобы действовать как обычный текст.
Из этого должно быть понятно, что, следовательно, внутри и снаружи кавычек три двойные кавычки действуют как неэкранированные двойные кавычки в виде обычного текста:
будет печатать
Tim said to him, "What's been happening lately?"
как ожидалось. Поэтому три кавычки всегда можно надежно использовать как побег.Однако, понимая это, вы можете заметить, что четыре кавычки в конце могут быть сокращены до двух, поскольку технически это добавляет еще одну ненужную пустую группу с двойными кавычками.
Вот несколько примеров, чтобы закрыть его:
Последнее замечание: я не читал ничего из этого ни в одном учебном пособии - я придумал все это путем экспериментов. Следовательно, мое объяснение может быть неверным внутренне. Тем не менее, все приведенные выше примеры оценивают как дано, тем самым подтверждая (но не доказывая) мою теорию.
Я тестировал это на 64-битной Windows 7, используя только вызовы * .exe с передачей параметров (не * .bat, но я бы предположил, что он работает так же).
источник
Попробуй это:
"" перейти к одиночному "в параметре.
источник
myscript """test test"""
и это не сработает (первый параметр передается как"test
. На самом деле вам нужно три кавычки:myscript """"test test""
однако третью цитату в конце можно пропустить.char **argv
от моей программы запуска C к другому процессу, используя такие функции, какspawn
илиexec
. Спасибо. :-)Второй документ, процитированный Питером Мортенсеном в его комментарии к ответу Codesmith, дал мне много ясности. Этот документ был написан windowsinspired.com. Ссылка повторяется: лучший способ понять использование кавычек и экранирование аргументов командной строки Windows .
Дальнейшие методы проб и ошибок приводят к следующему руководству:
Избегайте двойных кавычек
"
с помощью каретки^
. Если вы хотите , чтобы другие символы со специальным значением для командной оболочки Windows , (например,<
,>
,|
,&
) должны интерпретироваться как обычные символы вместо этого, то избавиться от них с кареткой, тоже.Если вы хотите, чтобы ваша программа foo получала текст командной строки
"a\"b c" > d
и перенаправляла его вывод в файл out.txt , запустите вашу программу из командной оболочки Windows следующим образом:Если foo интерпретирует
\"
как буквальные двойные кавычки и ожидает, что неэкранированные двойные кавычки будут разделять аргументы, содержащие пробелы, то foo интерпретирует команду как указание одного аргументаa"b c
, одного аргумента>
и одного аргументаd
.Если вместо этого foo интерпретирует двойные двойные кавычки
""
как буквальные двойные кавычки, то запустите вашу программу какКлючевой вывод из процитированного документа состоит в том, что для командной оболочки 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"
качестве объединенных аргументов текст и может интерпретировать его как единственный аргумент, равныйa"b c
.Теперь, наконец, к исходному вопросу.
myscript '"test"'
вызываемый из командной оболочки Windows, переходит'"test"'
к myscript . Очевидно, myscript интерпретирует одинарные и двойные кавычки как разделители аргументов и удаляет их. Вам нужно выяснить, что myscript принимает как буквальные двойные кавычки, а затем указать это в вашей команде, используя^
для экранирования любых символов, которые имеют особое значение для командной оболочки Windows. Учитывая, чтоmyscript
это также доступно в Unix, возможно\"
, это поможет. Пытатьсяили, если вам не нужно перенаправление,
источник
Я вызываю powershell из cmd и передаю кавычки, и ни один из них не работает. Серьезный акцент помог избежать двойных кавычек на Win 10 Surface Pro.
Ниже приведены результаты, которые я получил для других символов, чтобы избежать двойных кавычек:
Использование другой цитаты для экранирования цитаты не привело к отсутствию кавычек. Как видите, сами символы были набраны, но не вышли из двойных кавычек.
источник