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

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

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

обновление 1: решение работает Ваэль 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 ответов


из 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 в ответ)
  • % убежал, как это: %% (на основе обновления 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

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


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

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

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

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

команда

echo this ^& that

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

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!

для того чтобы вывести наружу к трубе, мы должны заменить все &с в переменной значение С^&, которое мы можем сделать с синтаксисом %VAR:FROM=to%:

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

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

cmd /v /c echo !m!

это работает даже при записи в трубу

cmd /v /c echo !m! | clip

простой.


Если вам нужно 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

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

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

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

на ^ символ избегает кавычек в противном случае

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