Как избежать амперсандов в пакетных файлах?

Как избежать амперсандов в пакетном файле (или из командной строки Windows), чтобы использовать команду start для открытия веб-страниц с амперсандами в URL-адресе?

Двойные кавычки не работают с start; вместо этого запускается новое окно командной строки.

Обновление 1: решение Ваэля Даллула работает. Кроме того, если в 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.


person Peter Mortensen    schedule 25.08.2009    source источник
comment
Я отредактировал ответ belugabob, поэтому теперь он должен работать. Это просто причуда в start, из-за которой цитирование аргумента не выполняется, если его применить не задумываясь. И в целом, я думаю, что заключить аргумент в кавычки проще и менее подвержено ошибкам, чем экранировать каждый символ, которому нужно экранировать там.   -  person Joey    schedule 25.08.2009
comment
Как насчет знака плюса +, что я должен поставить перед ним, чтобы избежать его?   -  person william    schedule 01.03.2012
comment
В PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8" работает, потому что PowerShell удаляет кавычки   -  person phuclv    schedule 19.05.2017


Ответы (7)


Из cmd:

  • & экранируется следующим образом: ^& (на основе ответа @Wael Dalloul)
  • % не нужно экранировать

Пример:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8

Из командного файла

  • & экранируется следующим образом: ^& (на основе ответа @Wael Dalloul)
  • % экранируется следующим образом: %% (на основе обновления OP)

Пример:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8
person Lasse Christiansen    schedule 15.01.2015
comment
Он также может включать пример экранирования% - тогда я могу убрать свой вопрос. - person Peter Mortensen; 15.01.2015
comment
@PeterMortensen Определенно - я обновил свой ответ. - person Lasse Christiansen; 16.01.2015
comment
От каких персонажей мне также следует бежать? Я заметил, что мне нужно бежать | автор: ^ |. - person liquide; 07.10.2015
comment
В этом случае % не нужно экранировать, потому что кто будет настолько глуп, чтобы определить 20and как переменную среды? Если да, то вместо этого start http://www.google.com/search?q=ampersand%20and%20percentage может ссылаться наhttp://www.google.com/search?q=ampersandsomething-silly20percentage. Используя ^% для выхода в cmd, пример работает должным образом. - person TamaMcGlinn; 01.04.2020

& используется для разделения команд. Поэтому вы можете использовать ^, чтобы избежать &.

person Wael Dalloul    schedule 25.08.2009
comment
Как насчет знака плюса +, что я должен поставить перед ним, чтобы избежать его? - person william; 01.03.2012
comment
Это более общее применимое решение. Это также работает, если в параметре программы командной строки есть один или несколько амперсандов. Я только что столкнулся с этим - параметр был CGW5COMM & 10C4 & 8301. - person Peter Mortensen; 09.10.2013
comment
Цитирование амперсанда с символом вставки ^, похоже, работает не во всех обстоятельствах. Например, попытка выполнить msdeploy.exe с переключателем / p: для передачи пароля с амперсандом, похоже, не работает с какой-либо перестановкой, которую я пробовал (кавычки, двойные кавычки, фиктивный первый аргумент). - person Derek Greer; 12.08.2014
comment
Пример использования ^ будет бесценным. - person jpmc26; 03.01.2015
comment
@ jpmc26 Я добавил пример в этот ответ. - person Lasse Christiansen; 15.01.2015
comment
Например, из второго источника: То, как cmd.exe интерпретирует командную строку, отличается и полностью не зависит от того, как исполняемая программа интерпретирует командную строку. - person Peter Mortensen; 02.11.2018
comment
^ не работает для экранирования %. Вместо этого используйте %: %% - person Peter Mortensen; 16.11.2018
comment
@PeterMortensen ссылка recaptcha в вашем профиле мертва - person Jeremy; 16.11.2018

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

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

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
person belugabob    schedule 25.08.2009
comment
Хорошо, я признаю, что заголовок не полностью соответствует вопросу внутри. (Как вы думаете, мне следует сделать заголовок длиннее?) - person Peter Mortensen; 25.08.2009
comment
В конце концов, не так «Doh» - заключить в кавычки было правильной идеей - просто не знал о заголовке окна консоли. Спасибо, Йоханнес! - person belugabob; 25.08.2009
comment
PowerShell удалит кавычки из аргументов, поэтому это не удастся. Вам нужно использовать только start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8" в PowerShell - person phuclv; 19.05.2017

Команда

echo this ^& that

работает как положено, вывод

this & that

Команда

echo this ^& that > tmp

также работает, записывая строку в файл «tmp». Однако перед трубой

echo this ^& that | clip

^ трактуется совершенно иначе. Он пытается записать вывод двух команд «echo this» и «that» в канал. Эхо сработает, тогда "что" выдаст ошибку. Говоря

echo this ^& echo that | clip

поместит строки «это» и «то» в буфер обмена.

Без ^:

echo this & echo that | clip

первое эхо будет записано в консоль, и только вывод второго эха будет передан в клип (аналогично перенаправлению "> tmp"). Итак, когда вывод перенаправляется, ^ не цитирует &, а вместо этого заставляет его применять до перенаправления, а не после.

Чтобы вставить &, нужно процитировать его дважды

echo this ^^^& that | clip

Если вы поместите строку в переменную

set m=this ^& that

тогда

set m

выведет

m=this & that

но очевидное

echo %m%

терпит неудачу, потому что после того, как Windows заменит переменную, в результате

echo this & that

он анализирует это как новую команду и пытается выполнить «это».

В пакетном файле вы можете использовать отложенное расширение:

setlocal enableDelayedExpansion
echo !m!

Для вывода в канал мы должны заменить все & s в значении переменной на ^ &, что мы можем сделать с помощью синтаксиса% VAR: FROM = TO%:

echo !m:^&=^^^&! | clip

В командной строке "cmd / v" включает отложенное раскрытие:

cmd /v /c echo !m!

Это работает даже при записи в канал

cmd /v /c echo !m! | clip

Простой.

person Denis Howe    schedule 23.02.2016
comment
Ваше решение для труб работает, но ваши выводы более или менее ошибочны. Кстати. простой echo this ^^^& that | clip тоже работает. Чтобы понять, как работает «волшебный канал», вы можете прочитать SO: Почему задержанное расширение не работает, когда внутри блока кода, передаваемого по конвейеру? - person jeb; 23.02.2016

Если вам нужно echo строку, содержащую амперсанд, кавычки не помогут, потому что вы также увидите их на выходе. В таком случае используйте for:

for %a in ("First & Last") do echo %~a

... в пакетном скрипте:

for %%a in ("First & Last") do echo %%~a

or

for %%a in ("%~1") do echo %%~a
person Jaroslav Záruba    schedule 19.05.2017

Если у вас есть пробелы в имени файла и у вас есть символ, который нужно экранировать:

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

scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .

В противном случае символ ^ экранирует кавычки.

person be-ns    schedule 01.12.2017

Для специальных символов, таких как '&', вы можете заключить все выражение в кавычки.

set "url=https://url?retry=true&w=majority"

person Stan    schedule 27.10.2020
comment
Не мой отрицательный голос, но, похоже, это дублирует пару более старых ответов, как с более подробной информацией, так и с пояснениями. - person tripleee; 06.02.2021