Widzę, że daszek to udokumentowana postać ucieczki.
Ale mam przykład pokazujący, że w przypadku znaku podwójnego cudzysłowu ^
nie działa i musisz go użyć\
C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""
Dlaczego tak jest i gdzie jest to udokumentowane?
Cmd,
\
czy nie uciec"
. Oto szybki dowód i wyjaśnienie:Uruchom
echo "" & echo 1
. (&
jest specjalnym znakiem w cmd,left & right
oznacza „uruchom,left
a następnie uruchom”right
). Widzimy obaecho ""
iecho 1
są uruchamiane pomyślnie.Następnie uruchom
echo " & 1234
. Widzimy, że wynik jest" & 1234
. Jest tak, ponieważ otwarcie"
nie zostało zamknięte, a zatem wszystko po nim jest interpretowane jako ciąg znaków, w tym specjalny znak&
.Uruchom
echo "\" & 1234
.Jeśli
\
uniknie tego"
, otwarcie"
nie zostanie zamknięte, a znaki& 1234
zostaną zinterpretowane jako część łańcucha.Jeśli
\
nie następuje ucieczka"
, że po"
zamknie ciąg i& 1234
będzie nie należy interpretować jako części łańcucha.W wyniku nie widzimy
& 1234
interpretacji jako części ciągu. Dowodzi to, że\
nie udało mu się uciec"
.Co więc ucieka
"
w cudzysłowach za przekazywanie argumentów? Chociaż^
będzie działał poza cytatami (łatwo to sprawdzić za pomocąecho ^" & echo 1
), nie uchodzi cytatom w cudzysłowie.Rzeczywiście, w jaki sposób możemy uzyskać coś tak prostego jak
echo """
&
echo 1
praca?^
Char? ... Nie,echo "^"" & echo 1
wyniki"^""
i nie"""
.Co z
"
samym char? ... Nie,echo """" & echo 1
wyniki""""
i nie"""
.Faktem jest, że nie ma nic, co ucieknie
"
w cudzysłowie do przekazywania argumentów . Możesz się nad tym zastanawiać przez kilka lat i nie znaleźć rozwiązania. To tylko niektóre nieodłączne ograniczenia skryptów cmd.Dobra wiadomość jest taka, że najprawdopodobniej nigdy nie spotkasz się z sytuacją, w której musisz to zrobić. Jasne, nie ma sposobu, aby dostać się
echo """
&
echo 1
do pracy, ale to nie jest taka wielka sprawa, ponieważ jest to po prostu wymyślony problem, którego prawdopodobnie nigdy nie spotkasz.Rozważmy na przykład
runas
. Działa dobrze bez konieczności ucieczki"
w cudzysłowie, ponieważrunas
wiedział, że nie ma na to sposobu i wprowadził wewnętrzne poprawki, aby obejść ten problem.runas
wymyślił własne reguły analizy (runas /flag "anything even including quotes"
) i nie interpretuje argumentów cmd w zwykły sposób. Oficjalna dokumentacja tej specjalnej składni jest dość rzadka (lub nie istnieje). Oprócz/?
ihelp
jest to głównie metoda prób i błędów.źródło
\
Znak sprawia, że interpreter interpretować następny znak jako znak zamiast na identyfikatorze .Widać to również w kodzie:
jest to interpretowane jako
w twoim przykładzie, aby przekazać argumenty
cmd
, musi być ujęte w „”. Ale ponieważ argumentycmd
zawierające „(a to by zakończyło załącznik) są dołączane przez\
. Gdyby„ ”nie byłoby tam,/k dir \"%userprofile%\"
interpretowane byłyby jako argumenty przeciwkorunas
, a niecmd
.Powodem, dla którego zawierają% userprofile%, jest to, że jest to zmienna środowiskowa i zostanie zastąpiona tekstem, który może zawierać spacje, co (z tego samego powodu, co powyżej) spowodowałoby, że argument byłby
cmd
niepoprawny.źródło
cmd
za argument za runami, bo tak nie jest. Argumentem dla Runas jestcmd /k dir \"%userprofile%\"
. Nie mam teraz czasu, ale daj mi kilka godzin i powinienem być w stanie wytłumaczyć ci prosty program w C ++ oraz sposób, w jaki te programy interpretują argumenty. Myślę, że byłoby to bardziej jasne. Zatem odpowiedź na pewno się zmieni