Pomimo odpowiedzi dających złudzenie, że to działa, faktem jest, że nie można przekraść się w przestrzeni do zwykłych argumentów cmd. Łatwo to udowodnić:
Zapisz „ echo %1
” jako test.bat
. Ten plik wsadowy wyświetli pierwszy argument, który przekazuje nam cmd.
Teraz spróbuj uruchomić test.bat
, ustawiając wartość %1
na foo bar
. (Zwróć uwagę, że pomiędzy foo
i bar
) jest znak spacji .)
Próba i błąd przez kilka lat i zdaj sobie sprawę, że nie ma na to sposobu . Ludzie zasugerują ucieczkę przy użyciu ^
, ale test.bat foo^ bar
nie wyjdą foo bar
.
Tak więc nie ma sposobu, aby uzyskać wynik foo bar
, a najbliższe, co możemy uzyskać, to uruchomienie, test.bat foo" "bar
które produkuje foo" "bar
lub uruchomienie, test.bat "foo bar"
które produkuje "foo bar"
.
Teraz powód inne odpowiedzi pojawiają się do pracy jest, bo cd
ma swój własny dodatkowy parsowanie, rozbieżne z zachowaniem zwykłej kłótni przechodzącej (zwykły %1
, %2
, %3
i etc w typowych plików wsadowych).
Rozważmy na przykład osobliwe polecenie:
cd c:\documents and settings \some folder with spaces
Dlaczego to działa? Wynika to z tego, że cd
sam zrobił coś równoważnego z połączeniem 7 zwykłych argumentów w jeden logiczny. Zgodnie z normami przekazującymi argument cmd, widzimy 7 argumentów:
c:\documents
and
settings
\some
folder
with
spaces
To tak, jakby cd
połączył wszystkie 7 argumentów w jeden logiczny, robiąc coś podobnego array.join(" ")
, co tworzy ścieżkę:
c:\documents and settings \some folder with spaces
Zauważ, że to zachowanie jest specyficzne cd
tylko dla (i niektórych innych funkcji). Nie ma to nic wspólnego ze zwykłym przekazywaniem argumentów.
Rzeczywiście cd
ma inną osobliwość. Pamiętasz, jak powiedzieliśmy powyżej, że nie możemy uzyskać danych wyjściowych foo bar
? Najbliższym wyjściem, jaki możemy uzyskać, jest uruchomienie:
test.bat foo" "bar
który produkuje foo" "bar
lub:
test.bat "foo bar"
który produkuje "foo bar"
lub:
test.bat "foo "bar
który produkuje "foo "bar
lub:
test.bat foo" bar"
który produkuje foo" bar"
lub:
test.bat "foo b"ar
który produkuje "foo b"ar
lub:
test.bat fo"o bar"
który produkuje fo"o bar"
lub:
test.bat fo"o ba"r
który produkuje fo"o ba"r
lub:
test.bat "fo"o" bar"
który produkuje "fo"o" bar"
lub:
test.bat "f""o""o"" ""b""a""r":
który produkuje "f""o""o"" ""b""a""r"
, a nawet:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
który produkuje """"f"""o""""o"" ""ba"""r""""""""""
.
Wszystkie powyższe przykłady mają jedno podobieństwo, to znaczy, że wytworzą je foo bar
po odcięciu "
znaków. cd
autor też musiał to zrozumieć ... gdybyśmy wywnioskowali z cd
osobliwego zachowania, które odcina wszystko, "
co otrzymuje , pozwalając na działanie wszystkich tych poleceń:
cd c:\documents and settings
cd "c:\documents and settings"
cd "c:"\"documents and settings"
cd c:\"documents" "and" "settings"
cd c:\"docu"ments an"d set"tings"
cd c:"\"docu"ments an"d set"ti"""ngs
cd "c"":""\"docu"ments an"d set"ti"""ngs
cd "c"":""\"do""cu"me"nts a"n""d set"ti"""ngs
cd c"""":""""\"""d"""oc""""u"me"""""nt"s a"n""d set"""""""ti""""ngs