2009-08-25 6 views
112

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

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

Обновление 1: Решение Ваэля Даллула работает. Кроме того, если имеют URL-кодированные символы (например, пробел кодируется как % 20) в URL-адресе и , он находится в пакетном файле, тогда «%» должен быть , закодированным как «%%». В этом примере это не так.

Пример из командной строки (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.

+1

Я редактировал ответ belugabob так, чтобы он должен работать. Это просто причуда в 'start', которая приводит к отказу аргумента аргумента, если применить его без мысли. И в целом я считаю, что включение аргумента в кавычки проще и менее подвержено ошибкам, чем к побегу каждого персонажа, который нуждается в побеге там. – Joey

+0

А как насчет плюса '+' что я должен поставить перед тем, чтобы избежать его? – william

+0

В PowerShell «start» http://www.google.com/search?client=opera&rls=ru&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8 «' работает, потому что [PowerShell лишит кавычки] (https : //superuser.com/a/1208974/241386) –

ответ

39

Из ЦМД:

  • & спасшемся так: ^& (основано на @Wael Dalloul-х answer)
  • % не нужно экранировать

Пример:

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-х answer)
  • % спасшемся так: %% (на основе обновления OPS)

Пример:

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 
+0

Он также может включать в себя пример экранирования «%» - тогда я могу убрать свой вопрос. –

+0

@PeterMortensen Определенно - я обновил свой ответ. –

+1

Каким персонажам я должен убежать? Я заметил, что мне нужно бежать "|" по "^ |". – liquide

24

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

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

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8" 
+0

ОК, я признаю, что название не полностью совпадает с вопросом внутри. (Как вы думаете, я должен продлить название?) –

+0

Не так «Doh», в конце концов - в кавычки была правильная идея - просто не знала о заголовке окна консоли. Спасибо, Йоханнес! – belugabob

+0

[PowerShell лишит цитаты из аргументов] (https://superuser.com/a/1208974/241386), поэтому это не удастся. Вам нужно использовать только «start» http://www.google.com/search?client=opera&rls=ru&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8 "на PowerShell –

18
explorer "http://www.google.com/search?client=opera&rls=...." 
+2

Wow, который тоже работает. Все 3 из этих способов работают! – rogerdpack

131

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

+3

А как насчет плюса '+', что я должен поставить перед собой, чтобы избежать его? – william

+0

Это более общее применимое решение. Он также работает, если параметр командной строки имеет один или несколько амперсандов. Я просто столкнулся с этим - параметр был * CGW5COMM & 10C4 & 8301 *. –

+0

Цитирование амперсанда с символом каретки^не работает при любых обстоятельствах. Например, попытка выполнить msdeploy.exe с ключом/p: для передачи пароля с амперсандом, похоже, не работает с какой-либо перестановкой, которую я пробовал (каретка, двойные кавычки, фиктивный первый аргумент). –

7

Команда

echo this ^& that 

работы, как и ожидалось, outputing

this & that 

Команда

echo this ^& that > tmp 

также работает, как записать строку в файл "TMP". Однако перед трубой

echo this ^& that | clip 

the^интерпретируется совершенно по-разному. Он пытается записать вывод двух команд «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 

но очевидно

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

echo this & that 

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

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

setlocal enableDelayedExpansion 
echo !m! 

Для вывода на трубе, мы должны заменить все & S в значении переменной с^&, что мы можем сделать с Значение% ВДП: оТ = к% синтаксис:

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

в командной строке, "CMD/х" обеспечивает замедленное расширение:

cmd /v /c echo !m! 

Это работает даже при записи на трубе

cmd /v /c echo !m! | clip 

Simple.

+0

Ваше решение для труб работает, но ваши выводы более или менее ошибочны. Btw. простое эхо это ^^^ &, что | клип' тоже работает. Чтобы понять обработку магических труб, вы можете прочитать [SO: Почему задержка с расширением заканчивается, когда внутри блока кода?] (Http://stackoverflow.com/q/8192318/463115) – jeb

+0

Спасибо, что указали, что 'echo% m% 'непригодно. – Jarekczek

0

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

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

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

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

или

for %%a in ("%~1") do echo %%~a 
0

Добавление этого для будущих пользователей -

Если у вас есть пробелы в имени файла И у вас есть символ, который вам нужно убежать: you ca n используйте одиночные и двойные кавычки, чтобы избежать ошибок в команде.

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

^ характер экранирует кавычки иначе

отредактированные включить закрытие . в конце команды

Смежные вопросы