Jak zmienić znaczenie znaku ampersand w pliku wsadowym (lub w wierszu poleceń systemu Windows), aby użyć start
polecenia do otwierania stron internetowych ze znakami ampersand w adresie URL?
Podwójne cudzysłowy nie będą działać z start
; zamiast tego uruchamia nowe okno wiersza poleceń.
Aktualizacja 1 : Rozwiązanie Wael Dalloul działa. Ponadto, jeśli w adresie URL znajdują się znaki zakodowane w adresie URL (np. Spacja jest zakodowana jako% 20) i znajduje się on w pliku wsadowym, wówczas „%” musi być zakodowane jako „%%”. Tak nie jest w tym 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-bitowy z dodatkiem SP2.
windows
batch-file
escaping
ampersand
Peter Mortensen
źródło
źródło
start
które powoduje, że cytowanie argumentu zawodzi, jeśli zostanie zastosowane bez namysłu. Ogólnie myślę, że zamknięcie argumentu w cudzysłowie jest łatwiejsze i mniej podatne na błędy niż ucieczka przed każdą postacią, która musi tam uciec.+
co powinienem umieścić z przodu, aby przed nim uciec?start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
działa, ponieważ PowerShell usunie cytatyOdpowiedzi:
Z cmd :
&
ucieka w ten sposób:^&
(na podstawie odpowiedzi @Wael Dalloul )%
nie trzeba uciekaćPrzykład:
Z pliku wsadowego
&
ucieka w ten sposób:^&
(na podstawie odpowiedzi @Wael Dalloul )%
ucieka w ten sposób:%%
(na podstawie aktualizacji PO)Przykład:
źródło
%
nie ma potrzeby ucieczki, bo kto byłby na tyle głupi, by zdefiniować ją20and
jako zmienną środowiskową? Jeśli tak, możesz zamiast tegostart http://www.google.com/search?q=ampersand%20and%20percentage
linkhttp://www.google.com/search?q=ampersandsomething-silly20percentage
. Używając^%
do ucieczki w cmd, przykład działa zgodnie z oczekiwaniami.&
służy do oddzielania poleceń. Dlatego możesz użyć^
do ucieczki przed&
.źródło
+
co powinienem umieścić z przodu, aby przed nim uciec?^
byłby nieoceniony.Możesz ująć go w cudzysłów, jeśli podasz fikcyjny pierwszy argument.
Zauważ, że musisz podać fikcyjny pierwszy argument w tym przypadku, ponieważ
start
potraktuje pierwszy argument jako tytuł dla nowych okien konsoli, jeśli jest cytowany. Więc powinno działać (i działa tutaj):źródło
start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
na PowerShellźródło
Komenda
działa zgodnie z oczekiwaniami
Komenda
działa również, zapisując łańcuch do pliku "tmp". Jednak przed fajką
^ jest interpretowane zupełnie inaczej. Próbuje zapisać wynik dwóch poleceń „echo to” i „tamto” do potoku. Echo zadziała, a wtedy „to” spowoduje błąd. Powiedzenie
umieści łańcuchy „to” i „tamto” w schowku.
Bez ^:
pierwsze echo zapisze do konsoli i tylko wyjście drugiego echa zostanie przesłane potokiem do klipu (podobnie przy przekierowaniu "> tmp"). Tak więc, kiedy wyjście jest przekierowywane, ^ nie cytuje znaku &, ale zamiast tego powoduje, że jest on stosowany przed przekierowaniem, a nie po.
Aby wpisać &, musisz go zacytować dwukrotnie
Jeśli umieścisz ciąg w zmiennej
następnie
wyjdzie
ale oczywiste
kończy się niepowodzeniem, ponieważ po zastąpieniu zmiennej przez system Windows zmienną, w wyniku czego
analizuje to jako nowe polecenie i próbuje wykonać „tamto”.
W pliku wsadowym możesz użyć opóźnionego rozwijania :
Aby wyprowadzić do potoku, musimy zamienić wszystkie & sw wartości zmiennej na ^ &, co możemy zrobić za pomocą składni% VAR: FROM = TO%:
W wierszu poleceń „cmd / v” włącza opóźnione rozwijanie:
Działa to nawet podczas pisania do potoku
Prosty.
źródło
echo this ^^^& that | clip
też działa. Aby zrozumieć obsługę magicznego potoku, możesz przeczytać TAK: Dlaczego opóźnione rozwinięcie kończy się niepowodzeniem, gdy znajduje się wewnątrz bloku kodu potokowego?Jeśli potrzebujesz
echo
ciągu zawierającego ampersand, cudzysłowy nie pomogą, ponieważ zobaczysz je również na wyjściu. W takim przypadku użyjfor
:... w skrypcie wsadowym:
lub
źródło
Jeśli masz spacje w nazwie pliku i masz postać, którą musisz uciec:
Możesz używać pojedynczych i podwójnych cudzysłowów, aby uniknąć błędnych nazw w poleceniu.
W
^
przeciwnym razie znak uniknie cudzysłowu.źródło