Jak uciec ampersands w plikach wsadowych?

Jak uciec ampersands w pliku wsadowym (lub z Windows command line) w celu użycia polecenia start do otworzyć strony internetowe z ampersands w adresie URL?

Podwójne cudzysłowy nie będą działać z start; to rozpoczyna nowy zamiast tego okno wiersza poleceń.

Update 1 : rozwiązanie Waela Dalloula działa. Ponadto, jeśli są zakodowane znaki URL (np. spacja jest zakodowana jako %20) w adresie URL i jest w pliku wsadowym wtedy ' % ' musi być kodowane jako'%%'. Tak nie jest w przykładzie.

Przykład z wiersza poleceń (CMD.EXE):

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

Spowoduje

http://www.google.com/search?client=opera 

Otwierane w domyślnej przeglądarce i te błędy w oknie wiersza poleceń:

'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.

Platforma: Windows XP 64 bit SP2.

Author: Peter Mortensen, 2009-08-25

7 answers

Z cmd :

  • & jest tak: ^& (na podstawie odpowiedzi @ Wael Dalloul )
  • % nie trzeba uciekać

Przykład:

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

Z pliku wsadowego

  • & jest tak: ^& (na podstawie odpowiedzi @ Wael Dalloul )
  • % jest uciekany w ten sposób: %% (na podstawie aktualizacji OPs)

Przykład:

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
 57
Author: Lasse Christiansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:05

& służy do oddzielania poleceń. Dlatego możesz użyć ^, aby uciec &.

 133
Author: Wael Dalloul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-06 11:10:12

Możesz dołączyć go do cudzysłowów, jeśli podasz fałszywy pierwszy argument.

Zauważ, że w tym przypadku musisz podać fałszywy pierwszy argument, ponieważ start będzie traktował pierwszy argument jako tytuł dla nowych okien konsoli, jeśli jest cytowany. Tak więc powinno działać (i działa tutaj):

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
 25
Author: belugabob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-17 13:49:07
explorer "http://www.google.com/search?client=opera&rls=...."
 18
Author: adatapost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-17 19:32:39

Komenda

echo this ^& that

Działa zgodnie z oczekiwaniami, wychodząc

this & that

Komenda

echo this ^& that > tmp

Działa również, zapisując łańcuch do pliku "tmp". Jednak przed rurą

echo this ^& that | clip

^ jest interpretowany zupełnie inaczej. Próbuje zapisać wyjście dwóch poleceń "echo to" i "tamto" do rury. Echo będzie działać wtedy "że" da błąd. Powiedzenie

echo this ^& echo that | clip

Umieści ciągi " to " i "tamto" na Schowek.

BEZ^:

echo this & echo that | clip

Pierwsze echo będzie zapisywane do konsoli, a tylko drugie echo będzie przesyłane do klipu (podobnie w przypadku przekierowania "> tmp"). Tak więc, gdy wyjście jest przekierowywane, ^ nie cytuje & , ale zamiast tego powoduje, że zostanie zastosowane przed przekierowaniem, a nie po.

Aby napisać&, musisz zacytować go dwa razy

echo this ^^^& that | clip

Jeśli umieścisz łańcuch w zmiennej

set m=this ^& that

Then

set m

Will wyjście

m=this & that

Ale oczywiste

echo %m%

Nie powiedzie się, ponieważ po zastąpieniu zmiennej przez Windows, w wyniku

echo this & that

Parsuje to jako nowe polecenie i próbuje wykonać "tamto".

W pliku wsadowym możesz użyć opóźnionego rozszerzenia :

setlocal enableDelayedExpansion
echo !m!

Aby wyjść do rury, musimy zastąpić wszystkie &s w wartości zmiennej^&, co możemy zrobić ze składnią %VAR: FROM = to%:

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

W wierszu poleceń "cmd / v" włącza opóźnione rozszerzenie:

cmd /v /c echo !m!
To działa nawet przy pisaniu do rury]}
cmd /v /c echo !m! | clip

Proste.

 10
Author: Denis Howe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 13:28:46

Jeśli potrzebujesz echo łańcuch zawierający Ampersand cudzysłowów nie pomoże, ponieważ zobaczysz je również na wyjściu. W takim przypadku użyj for:

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

...w skrypcie wsadowym:

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

Lub

for %%a in ("%~1") do echo %%~a
 0
Author: Jaroslav Záruba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-19 12:10:02

Dodawanie tego dla przyszłych użytkowników -

Jeśli masz spacje w nazwie pliku i masz znak, musisz uciec: można używać cudzysłowów pojedynczych i podwójnych, aby uniknąć błędów w poleceniu.

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

Znak ^ opuszcza cudzysłów w przeciwnym razie

edited to include the closing . at the end of the command

 0
Author: be-ns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-01 23:01:58