Odpowiedzi:
Jeden z przykładów RUNAS /?
pokazuje tę składnię. Daszek jest znakiem ucieczki, CMD.EXE
ale w systemie Windows poszczególne programy mogą dowolnie implementować własne znaki ucieczki i globowanie.
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 oba echo ""
i echo 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 /?
i help
jest to głównie metoda prób i błędów.
\
Znak sprawia, że interpreter interpretować następny znak jako znak zamiast na identyfikatorze .
Widać to również w kodzie:
"Hello \"World\""
jest to interpretowane jako
Hello "World"
w twoim przykładzie, aby przekazać argumenty cmd
, musi być ujęte w „”. Ale ponieważ argumenty cmd
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 przeciwko runas
, a nie cmd
.
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.
cmd
za argument za runami, bo tak nie jest. Argumentem dla Runas jest cmd /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