Как экранировать амперсанды в командном файле (или из командной строки Windows), чтобы использовать start
команду для открытия веб-страниц с амперсандами в URL-адресе?
Двойные кавычки не будут работать с start
; вместо этого запускается новое окно командной строки.
Обновление 1 : решение Wael Dalloul работает. Кроме того, если в URL есть символы, закодированные в URL (например, пробел закодирован как% 20), и он находится в пакетном файле, то «%» должен быть закодирован как «%%». Это не тот случай в примере.
Пример из командной строки ( CMD.EXE
):
start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8
приведет к
http://www.google.com/search?client=opera
открывается в браузере по умолчанию и эти ошибки в окне командной строки:
'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.
Платформа: Windows XP 64 бит SP2.
windows
batch-file
escaping
ampersand
Питер Мортенсен
источник
источник
start
которых цитирование аргумента терпит неудачу, если применяется без размышлений. В целом, я думаю, что заключить аргумент в кавычки проще и менее подвержено ошибкам, чем избегать каждого символа, который нуждается в экранировании.+
что я должен поставить перед ним, чтобы избежать этого?start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
работает, потому что PowerShellОтветы:
Из cmd :
&
экранируется , как это:^&
(основано на @Wael Dalloul в ответ )%
не нужно убегатьПример:
Из командного файла
&
экранируется , как это:^&
(основано на @Wael Dalloul в ответ )%
экранируется следующим образом:%%
(на основе обновления OP)Пример:
источник
%
не нужно избегать, потому что кто был бы достаточно глуп, чтобы определить20and
в качестве переменной среды? Если вы сделали,start http://www.google.com/search?q=ampersand%20and%20percentage
могли быhttp://www.google.com/search?q=ampersandsomething-silly20percentage
вместо ссылки . Используя^%
escape в cmd, пример работает как положено.&
используется для разделения команд. Поэтому вы можете использовать,^
чтобы избежать&
.источник
+
что я должен поставить перед ним, чтобы избежать этого?^
будет неоценимым.Вы можете заключить его в кавычки, если указали фиктивный первый аргумент.
Обратите внимание, что в этом случае вам необходимо указать фиктивный первый аргумент, так как
start
первый аргумент будет рассматриваться как заголовок для новых окон консоли, если он указан в кавычках. Таким образом, следующее должно работать (и работает здесь):источник
start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
на PowerShellисточник
Команда
работает как положено, выводит
Команда
также работает, записывая строку в файл "tmp". Тем не менее, перед трубой
^ интерпретируется совершенно по-другому. Он пытается записать вывод двух команд «повторить это» и «это» в канал. Сработает эхо, тогда «то» выдаст ошибку. поговорка
поместит строки «это» и «это» в буфер обмена.
Без ^:
первый эхо-сигнал будет записан на консоль, и только выходные данные второго эхо-сигнала будут переданы для ограничения (аналогично для перенаправления «> tmp»). Таким образом, когда вывод перенаправляется, ^ не заключает в кавычки &, а вместо этого вызывает его применение до перенаправления, а не после.
Чтобы передать &, вы должны указать это дважды
Если вы поместите строку в переменную
затем
будет выводить
но очевидное
не удается, потому что после того, как Windows заменяет переменную, в результате
он анализирует это как новую команду и пытается выполнить «это».
В пакетном файле вы можете использовать отложенное расширение :
Для вывода в канал мы должны заменить все & s в значении переменной на ^ &, что мы можем сделать с помощью синтаксиса% VAR: FROM = TO%:
В командной строке «cmd / v» включает отложенное расширение:
Это работает даже при записи в канал
Просто.
источник
echo this ^^^& that | clip
работа тоже. Чтобы понять магическую обработку каналов, вы можете прочитать SO: Почему отложенное расширение завершается неудачно, когда находится внутри переданного блока кода?Если вам нужна
echo
строка, содержащая амперсанд, кавычки не помогут, потому что вы также увидите их на выходе. В таком случае используйтеfor
:... в пакетном скрипте:
или
источник
Если у вас есть пробелы в имени файла, и у вас есть символ, вам нужно экранировать:
Вы можете использовать одинарные И двойные кавычки, чтобы избежать ошибок в команде.
В
^
противном случае персонаж избегает кавычек.источник