Odpowiedzi:
Jeden z przykładów RUNAS /?pokazuje tę składnię. Daszek jest znakiem ucieczki, CMD.EXEale 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 & rightoznacza „uruchom, lefta następnie uruchom” right). Widzimy oba echo ""i echo 1są 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 & 1234zostaną zinterpretowane jako część łańcucha.
Jeśli \nie następuje ucieczka ", że po "zamknie ciąg i & 1234będzie nie należy interpretować jako części łańcucha.
W wyniku nie widzimy & 1234interpretacji 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 1praca?
^Char? ... Nie, echo "^"" & echo 1wyniki "^""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 1do 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ż runaswiedział, że nie ma na to sposobu i wprowadził wewnętrzne poprawki, aby obejść ten problem. runaswymyś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 helpjest 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 cmdzawierają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 cmdniepoprawny.
cmdza 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