Как избежать амперсандов в пакетных файлах?
Как избежать амперсандов в пакетном файле (или из
Командная строка 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"' .
Символ ^
избегает кавычек иначе
отредактирован, чтобы включить закрытие .
в конце команды