Як уникнути амперсандів у пакетних файлах?


146

Як уникнути амперсандів у пакетному файлі (або з командного рядка Windows), щоб використовувати startкоманду для відкриття веб-сторінок з розширеннями в URL?

Подвійні котирування не працюватимуть start; це запускає нове вікно командного рядка.

Оновлення 1 : рішення Ваеля Даллоула працює. Крім того, якщо в URL-адресі є кодовані символи (наприклад, простір кодується як% 20), і він знаходиться в пакетному файлі, тоді '%' повинен бути закодований як '%%'. Це не так у прикладі.

Приклад із командного рядка ( 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
Я відредагував відповідь belugabob, щоб вона мала працювати зараз. Це просто химерність, в startякій цитування аргументу виходить з ладу, якщо застосовуватися без думки. І в цілому, я думаю, що вкладати аргументи в лапки простіше і менше схильних до помилок, ніж уникнути кожного персонажа, який потребує втечі туди.
Joey

Що з плюсом підпишіть, +що я повинен поставити перед, щоб уникнути цього?
Вілліям

У PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"працює, оскільки PowerShell
зніме

Відповіді:


91

Від 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 в відповідь )
  • %виходить так: %%(на основі оновлення ОП)

Приклад:

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

Це може також включати приклад уникнення "%" - тоді я можу прибрати своє запитання.
Пітер Мортенсен

@PeterMortensen Однозначно - я оновив свою відповідь.
Лассе Крістіансен

2
Від яких персонажів я також повинен утекти? Я помітив, що мені потрібно втекти "|" за "^ |".
ліквідувати

У цьому випадку %не потрібно уникати, бо хто був би досить нерозумний, щоб визначити 20andзмінну середовища? Якщо ви це зробили, start http://www.google.com/search?q=ampersand%20and%20percentageможете http://www.google.com/search?q=ampersandsomething-silly20percentageзамість цього посилання . Використовуючи ^%для втечі в cmd, приклад працює як очікувалося.
TamaMcGlinn

145

&використовується для розділення команд. Тому ви можете використовувати ^для втечі &.


3
Що з плюсом підпишіть, +що я повинен поставити перед, щоб уникнути цього?
Вілліям

Це більш загальне застосовне рішення. Він також працює, якщо параметр програми командного рядка має в ньому один або більше підсилювачів. Я щойно стикався з цим - параметром був CGW5COMM & 10C4 & 8301 .
Пітер Мортенсен

Цитування амперсанда з символом каретки ^, здається, не працює за будь-яких обставин. Наприклад, спроба виконати msdeploy.exe за допомогою перемикача / p: для передачі пароля з ampersand, схоже, не працює з будь-якою перестановкою, яку я намагався (цитата карети, подвійні цитати, перший аргумент манекена).
Дерек Грір

3
Приклад використання ^був би неоціненним.
jpmc26

2
@ jpmc26 Я додав приклад у цій відповіді .
Лассе Крістіансен

29

Ви можете укласти його в лапки, якщо ви подасте фіктивний перший аргумент.

Зауважте, що в цьому випадку вам потрібно надати фіктивний перший аргумент, оскільки startвін трактуватиме перший аргумент як заголовок для нових вікон консолі, якщо він цитується. Отже, слід працювати (і тут):

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

Гаразд, визнаю, заголовок не повністю відповідає питанню всередині. (Як ви думаєте, я повинен зробити заголовок довшим?)
Пітер Мортенсен,

Зрештою, не так "Дох" - укладання в лапки було правильною ідеєю - просто не знав про те, що стосується заголовка вікна консолі. Дякую Йоханнес!
belugabob

PowerShell зніме цитати з аргументів , тому це не вдасться. Використовувати потрібно лише start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"в PowerShell
phuclv


12

Команда

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

Простий.


Ваше рішення для труб працює, але ваші висновки більш-менш помилкові. Btw. проста echo this ^^^& that | clipробота теж. Щоб зрозуміти магічну обробку труб, ви можете прочитати ТАК: Чому затримка розширення не вдається, коли знаходиться всередині трубопроводу коду?
1616

1

Якщо вам потрібна 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

Якщо у вас є прогалини в імені файлу і у вас є символ , який потрібно бігти:

Ви можете використовувати одиночні І подвійні лапки, щоб уникнути помилок у команді.

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

^Характер екранує лапки інакше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.