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.
7 answers
Z cmd :
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
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 &
.
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"
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=...."
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.
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
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
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