Подтвердить что ты не робот

Выключить двойные кавычки в параметре

В Unix я мог запустить myscript '"test"' и получить "test".

В Windows cmd я получаю 'test'.

Как я могу передать двойные кавычки в качестве параметра? Я хотел бы знать, как сделать это вручную из окна cmd чтобы мне не нужно было писать программу для тестирования моей программы.

4b9b3361

Ответ 1

Я не могу быстро воспроизвести симптомы: если я попробую myscript '"test"' с командным файлом myscript.bat, содержащим только @echo.%1 или даже @echo.%~1, я получаю все кавычки: '"test"'

Возможно, вы можете попробовать escape-символ ^ следующим образом: myscript '^"test^"'?

Ответ 2

Другой способ избежать кавычек (хотя, вероятно, и не желательно), который я нашел в некоторых местах, - это использовать несколько двойных кавычек. Для того, чтобы сделать других людей четкими, я объясню.

Вот набор основных правил:

  • Когда не завернуты в группы с двойными кавычками, пробелы разделяют параметры:
    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!"

Таким образом, существуют три разных типа двойных кавычек: открытые кавычки, цитаты, которые закрываются, и кавычки, которые действуют как обычный текст.
Здесь разбивка этой последней запутанной строки:

"   open double-quote group
T   inside ""s
i   inside ""s
m   inside ""s
    inside ""s - space doesn't separate
s   inside ""s
a   inside ""s
y   inside ""s
s   inside ""s
,   inside ""s
    inside ""s - space doesn't separate
"   close double-quoted group
"   quote directly follows closer - acts as plain unwrapped text: "
H   outside ""s - gets joined to previous adjacent group
i   outside ""s - ...
!   outside ""s - ...
"   open double-quote group
"   close double-quote group
"   quote directly follows closer - acts as plain unwrapped text: "

Таким образом, текст эффективно объединяет четыре группы символов (один с ничем, однако):
Tim says, является первым, завернутым в escape-пространство
"Hi! является вторым, не завернутым (нет пробелов)
является третьим, группа с двойными кавычками ничего не делает
" - четвертая, развернутая закрытая цитата.

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

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

"Tim said to him, """What been happening lately?""""

напечатает Tim said to him, "What been happening lately?", как ожидалось. Таким образом, три кавычки всегда можно надежно использовать в качестве побега.
Однако, понимая это, вы можете заметить, что четыре кавычки в конце можно свести к двум простым, поскольку он технически добавляет еще одну ненужную пустую двойную копию, цитируемой группы.

Вот несколько примеров, чтобы закрыть его:

program a b                       REM sends (a) and (b)
program """a"""                   REM sends ("a")
program """a b"""                 REM sends ("a) and (b")
program """"Hello,""" Mike said." REM sends ("Hello," Mike said.)
program ""a""b""c""d""            REM sends (abcd) since the "" groups wrap nothing
program "hello to """quotes""     REM sends (hello to "quotes")
program """"hello world""         REM sends ("hello world")
program """hello" world""         REM sends ("hello world")
program """hello "world""         REM sends ("hello) and (world")
program "hello ""world"""         REM sends (hello "world")
program "hello """world""         REM sends (hello "world")

Заключительное примечание: я не читал ни одного из этого урока из любого учебника - я придумал все это, экспериментируя. Поэтому мои объяснения могут быть неверными внутри. Тем не менее, все приведенные выше примеры оцениваются как заданные, что подтверждает (но не доказывает) мою теорию.

Я тестировал это на Windows 7, 64bit, используя только вызовы *.exe с передачей параметров (не *.bat, но я бы предположил, что он работает одинаково).

Ответ 3

Попробуйте следующее:

myscript """test"""

"перейти к одному" в параметре.

Ответ 4

Второй документ, цитируемый Питером Мортенсеном в его комментарии к ответу Кодесмита, прояснил ситуацию для меня. Этот документ был написан windowsinspired.com. Ссылка повторяется: лучший способ понять цитирование и экранирование аргументов командной строки Windows.

Некоторые дальнейшие пробы и ошибки приводят к следующему руководству:

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

Если вы хотите, чтобы ваша программа foo получила текст командной строки "a\"bc" > d и перенаправила ее вывод в файл out.txt, то запустите вашу программу следующим образом из командной оболочки Windows:

foo ^"a\^"b c^" ^> d > out.txt

Если foo интерпретирует \" как буквальную двойную кавычку и ожидает, что неэкранированные двойные кавычки будут разделять аргументы, содержащие пробел, тогда foo интерпретирует команду как указание одного аргумента a"bc, одного аргумента > и одного аргумента 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\"bc" качестве текста комбинированных аргументов и может интерпретировать его как один аргумент, равный a"bc.

Теперь - наконец - к первоначальному вопросу. myscript '"test"' вызываемый из командной оболочки Windows, передает '"test"' в myscript. Очевидно, myscript интерпретирует одинарные и двойные кавычки как разделители аргументов и удаляет их. Вам нужно выяснить, что myscript принимает как буквальную двойную кавычку, а затем указать это в своей команде, используя ^ для экранирования любых символов, которые имеют особое значение для командной оболочки Windows. Учитывая, что myscript также доступен в Unix, возможно, \" делает myscript дело. Попробуйте

myscript \^"test\^"

или, если вам не нужно перенаправление,

myscript \"test\"

Ответ 5

Я звоню powershell из cmd, и прохождение кавычек, и ни один из этих способов не сработал. Серьезный акцент работал, чтобы избежать двойных кавычек на этом поверхностном профессионале Win 10.

>powershell.exe "echo la'"" >> test
>type test
la"

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

la\
la^
la
la~

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