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

Как избежать амперсандов в пакетном файле (или из Командная строка 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

Из cmd:

  • & выполняется следующим образом: ^& (на основе @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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Команда

echo this ^& that

работает как ожидалось, выводя

this & that

Команда

echo this ^& that > tmp

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

echo this ^& that | clip

the ^ интерпретируется совершенно по-разному. Он пытается записать вывод двух команд "echo this" и "that" в трубу. Эхо будет работать, тогда "это" даст ошибку. Высказывание

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.

Ответ 6

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

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

... в пакете script:

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

или

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

Ответ 7

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

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

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

Символ ^ избегает кавычек иначе

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