Jak usunąć znak & w plikach wsadowych?

146

Jak zmienić znaczenie znaku ampersand w pliku wsadowym (lub w wierszu poleceń systemu Windows), aby użyć startpolecenia 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.

Peter Mortensen
źródło
1
Zredagowałem odpowiedź Belugabob, więc powinna teraz działać. To tylko dziwactwo, startktó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.
Joey
A co ze znakiem plus, +co powinienem umieścić z przodu, aby przed nim uciec?
william
W PowerShell 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 cytaty
phuclv

Odpowiedzi:

91

Z cmd :

  • &ucieka w ten sposób: ^&(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

  • &ucieka w ten sposób: ^&(na podstawie odpowiedzi @Wael Dalloul )
  • %ucieka w ten sposób: %%(na podstawie aktualizacji PO)

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
Lasse Christiansen
źródło
Może również zawierać przykład ucieczki przed „%” - wtedy mogę uporządkować swoje pytanie.
Peter Mortensen
@PeterMortensen Zdecydowanie - zaktualizowałem moją odpowiedź.
Lasse Christiansen
2
Którym postaciom też mam uciec? Zauważyłem, że muszę uciec "|" użytkownika „^ |”.
liquid
W tym przypadku %nie ma potrzeby ucieczki, bo kto byłby na tyle głupi, by zdefiniować ją 20andjako zmienną środowiskową? Jeśli tak, możesz zamiast tego start http://www.google.com/search?q=ampersand%20and%20percentagelink http://www.google.com/search?q=ampersandsomething-silly20percentage. Używając ^%do ucieczki w cmd, przykład działa zgodnie z oczekiwaniami.
TamaMcGlinn
145

&służy do oddzielania poleceń. Dlatego możesz użyć ^do ucieczki przed &.

Wael Dalloul
źródło
3
A co ze znakiem plus, +co powinienem umieścić z przodu, aby przed nim uciec?
william
Jest to bardziej ogólne rozwiązanie. Działa również, jeśli parametr programu wiersza poleceń zawiera co najmniej jeden znak ampersandu. Właśnie się z tym spotkałem - parametr to CGW5COMM i 10C4 i 8301 .
Peter Mortensen
Cytując znak ampersand z daszkiem ^ nie wydaje się działać w każdych okolicznościach. Na przykład próba uruchomienia msdeploy.exe z przełącznikiem / p: w celu przekazania hasła za pomocą znaku ampersand nie działa z żadną próbowaną przeze mnie permutacją (cudzysłów, cudzysłowy, fikcyjny pierwszy argument).
Derek Greer
3
Przykład użycia ^byłby nieoceniony.
jpmc26
2
@ jpmc26 Dodałem przykład w tej odpowiedzi .
Lasse Christiansen
29

Możesz ująć go w cudzysłów, jeśli podasz fikcyjny pierwszy argument.

Zauważ, że musisz podać fikcyjny pierwszy argument w tym przypadku, ponieważ startpotraktuje pierwszy argument jako tytuł dla nowych okien konsoli, jeśli jest cytowany. 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"
belugabob
źródło
OK, przyznam, że tytuł nie do końca odpowiada pytaniu w środku. (Myślisz, że powinienem przedłużyć tytuł?)
Peter Mortensen,
Nie tak „Doh”, mimo wszystko - umieszczanie w cudzysłowach było dobrym pomysłem - po prostu nie wiedziałem o tytule okna konsoli. Dzięki Johannes!
belugabob
PowerShell usunie cudzysłowy z argumentów , więc to się nie powiedzie. Musisz używać tylko start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"na PowerShell
phuclv
20
explorer "http://www.google.com/search?client=opera&rls=...."
adatapost
źródło
12

Komenda

echo this ^& that

działa zgodnie z oczekiwaniami

this & that

Komenda

echo this ^& that > tmp

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

echo this ^& that | clip

^ 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

echo this ^& echo that | clip

umieści łańcuchy „to” i „tamto” w schowku.

Bez ^:

echo this & echo that | clip

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

echo this ^^^& that | clip

Jeśli umieścisz ciąg w zmiennej

set m=this ^& that

następnie

set m

wyjdzie

m=this & that

ale oczywiste

echo %m%

kończy się niepowodzeniem, ponieważ po zastąpieniu zmiennej przez system Windows zmienną, w wyniku czego

echo this & that

analizuje to jako nowe polecenie i próbuje wykonać „tamto”.

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

setlocal enableDelayedExpansion
echo !m!

Aby wyprowadzić do potoku, musimy zamienić wszystkie & sw wartości zmiennej na ^ &, co możemy zrobić za pomocą składni% VAR: FROM = TO%:

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

W wierszu poleceń „cmd / v” włącza opóźnione rozwijanie:

cmd /v /c echo !m!

Działa to nawet podczas pisania do potoku

cmd /v /c echo !m! | clip

Prosty.

Denis Howe
źródło
Twoje rozwiązanie dla rur działa, ale twoje wnioski są mniej więcej błędne. Przy okazji. proste echo this ^^^& that | clipteż 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?
jeb
1

Jeśli potrzebujesz echociągu zawierającego ampersand, cudzysłowy nie pomogą, 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
Jaroslav Záruba
źródło
0

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.

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

W ^przeciwnym razie znak uniknie cudzysłowu.

be-ns
źródło