czy w wierszu polecenia jest znak ucieczki dla znaku „&”?

11

Próbuję czegoś takiego:

set pwd = abc&123
echo password %pwd%

Otrzymuję wynik jako ...

'123' is not recognized as an internal or external command, operable program or batch file. 
password abc

Czy taki system jest, czy też istnieje ucieczka dla takich postaci?

deostroll
źródło
1
To samo pytanie w SO Jak uciec ze znaków ampersands w plikach wsadowych?
Michael Freidgeim,

Odpowiedzi:

9

Musisz zawinąć swoje hasło w podwójne cudzysłowy:

set pwd="abc&123"
echo %pwd%

Daj mi znać jak idzie.

Carlos
źródło
1
Inną opcją, która może być lepsza w niektórych scenariuszach, jestset "pwd=abc&123"
Harry Johnston
1
-1 szokujące jest to, że miał 5 głosów pozytywnych, to źle. Windows używa% var% lub! Var! tak łatwo mogłeś to przetestować. $ var jest w
systemie
1
@barlop: ponieważ jest to druga linia, która odnosi się do pytania, nie widzę, żeby miało to znaczenie.
Harry Johnston,
7

Odkryłem, że najlepiej działa z kombinacją odpowiedzi Martineau i odpowiedzi mastashake57.

set pwd=abc^&123
echo %pwd%

Nadal zawodzi i

set pwd="abc&123"
echo %pwd%

Dodaje do niego cudzysłowy (nie można usunąć cudzysłowu za pomocą formanipulacji pętlą lub łańcuchem, ponieważ ponownie zawiedzie dzięki znakom ampersand), co nie jest takie świetne.

Jednak,

set "pwd=abc^&123"
echo %pwd%

Działa świetnie.

Mam nadzieję, że to pomaga.

BDM
źródło
+1. Pamiętaj, że pozostawia to karat w zmiennej środowiskowej, tzn. Ustawia pwdna abc^&123. Przez większość czasu jest to prawdopodobnie to, co musisz zrobić, ale może cię złapać, jeśli nie będziesz wiedział, co się dzieje.
Harry Johnston,
@HarryJohnston Muszę poprawić błąd ortograficzny. To jest CarEt. btw wiem ntcmds.chm wspomina o tym, ale gdzie w cmd /? czy wspomniano o dokumentacji, że daszek jest ucieczką?
barlop
@Barlop: tak jest; Myliłem to z homonimem. Zasadniczo /?stanowi jedynie podsumowanie, a nie wyczerpującą dokumentację.
Harry Johnston,
@barlop,? Daszek jest ucieczką.
Pacerier,
@Pacerier tak, caret jest ucieczką, nikt się z tym nie zgadza. i wspomniano, że jest to znak ucieczki, w ntcmds.chm (ntcmds.chm pochodzi z XP i znajduje się w równoważnym internetowym microsoft.com/resources/documentation/windows/xp/all/proddocs/... i może w jakiś sposób bardziej aktualne online - może więcej poleceń). Właśnie pytałem, gdzie w /? (jeśli gdziekolwiek), mówi, że karetka jest ucieczką
barlop
7

Z pliku pomocy odniesienia wiersza polecenia:

Znak ampersand (&), pipe (|) i nawiasy () są znakami specjalnymi, które muszą być poprzedzone znakiem zmiany znaczenia (^) lub znakiem cudzysłowu, gdy przekazujesz je jako argument.

Wydaje się, że umieszczenie całego hasła w cudzysłowie byłoby łatwiejsze niż unikanie pojedynczych znaków, jeśli w środku są więcej niż dwa znaki wymagające leczenia.

martineau
źródło
I cytaty w cudzysłowie?
Pacerier
4

Tak naprawdę potrzebujesz:

set pwd=abc^^^&123
echo %pwd%

Lub:

set "pwd=abc^&123"
echo %pwd%

Wyjaśnienie:

Ponieważ &jest to specjalny znak, musisz z niego uciec ^, w wyniku czego ^&.

Uruchomienie set pwd=abc^&123ustawi zmienną na wartość abc&123. Następnie, jeśli miałbyś biec echo %pwd%, skutecznie biegasz echo abc&123.

Jednak echo abc&123nie działa zgodnie z oczekiwaniami, ponieważ &jest specjalnym char. Można tego uniknąć, dodając cudzysłowy: echo "abc&123"ale dane wyjściowe również będą zawierały znaki cudzysłowu. Innymi słowy, stosowanie cudzysłowów nie jest właściwym rozwiązaniem.

Musisz tylko uciec od &znaku po uruchomieniu echopolecenia:

echo abc^&123

Zatem zmienna musi zawierać wartość abc^&123. Aby ustawić zmienną na wartość abc^&123, musisz uciec ze specjalnych znaków ^i &, w wyniku czego:

set pwd=abc^^^&123
Pacerier
źródło
+1 za wskazanie potrzeby ucieczki z karetki
jmcg
Działa świetnie, dziękuję. Ta postać ucieczki nie jest wymieniona w dokumencie z jakiegoś powodu docs.microsoft.com/en-us/windows-server/administration/...
Sergey Smolnikov