it-swarm.com.ru

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

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

123
Peter Mortensen

Из cmd:

  • & экранируется следующим образом: ^& (на основе @Wael Dalloul's 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's answer )
  • % экранируется следующим образом: %% (на основе обновления 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
62
Lasse Christiansen

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

133
Wael Dalloul

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

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

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

Команда

echo this ^& that

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

this & that

Команда

echo this ^& that > tmp

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

echo this ^& that | clip

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

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

Просто.

11
Denis Howe

Если вам нужно 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
1
Jaroslav Záruba

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

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

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

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

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

0
be-ns