Как мне избежать амперсандов в пакетных файлах? - PullRequest
129 голосов
/ 25 августа 2009

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

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

Обновление 1 : решение Wael Dalloul работает. Кроме того, если есть символы в кодировке 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.

Ответы [ 7 ]

139 голосов
/ 25 августа 2009

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

71 голосов
/ 15 января 2015

Из 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
27 голосов
/ 25 августа 2009

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

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

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
20 голосов
/ 25 августа 2009
12 голосов
/ 23 февраля 2016

Команда

echo this ^& that

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

this & that

Команда

echo this ^& that > tmp

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

echo this ^& that | clip

^ интерпретируется совершенно по-разному. Он пытается записать выходные данные двух команд «повторить это» и «это» в канал. Эхо сработает, тогда «то» выдаст ошибку. Высказывание

echo this ^& echo that | clip

поместит строки "this" и "that" в буфер обмена.

Без ^:

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

Simple.

1 голос
/ 19 мая 2017

Если вам нужно 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 голосов
/ 02 декабря 2017

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

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

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

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

...