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


в Unix я мог бы запустить myscript '"test"' и "test".

В Windows cmd Я 'test'.

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

3 69

3 ответа:

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

возможно, вы можете попробовать escape-символ ^ такой: myscript '^"test^"'?

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

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

  1. если не заключены в группы с двойными кавычками, пробелы разделяют параметры:
    program param1 param2 param 3 передаст четыре параметра в program.exe:
    param1,param2,param, и 3.
  2. группа в двойных кавычках игнорирует пробелы как разделители значений при передаче параметров в программы:
    program one two "three and more" пройдет три параметра program.exe:
    one,two и three and more.
  3. теперь, чтобы объяснить некоторые из путаницы:
  4. группы с двойными кавычками, которые появляются непосредственно рядом с текстом, не заключенным в двойные кавычки, объединяются в один параметр:
    hello"to the entire"world действует как один параметр:helloto the entireworld.
  5. Примечание: предыдущее правило не подразумевает, что две группы с двойными кавычками могут находиться непосредственно рядом друг с другом.
  6. любые двойные кавычки непосредственно после закрывающей кавычки обрабатывается как (или как часть) обычного развернутого текста, который находится рядом с группой двойных кавычек, но только одна двойная кавычка:
    "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, это первый, обернутый, чтобы избежать пробелов
"Hi! это второй, не завернутый (нет пробелов)
 is the third, a double-quote group wrapping nothing
" - это в-четвертых, развернутый конец цитаты.

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

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

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

печати Tim said to him, "What's 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, но я бы предположил, что он работает так же).

попробуйте это:

myscript """test"""

""escape to a single"в параметре.