Pomimo odpowiedzi dających złudzenie, że to działa, faktem jest, że nie można wkradać się w przestrzenie do zwykłych argumentów cmd. To jest łatwe do udowodnienia:
Zapisz “echo %1
” jako test.bat
. Ten plik wsadowy wyświetli pierwszy argument, który cmd nam przekaże.
Teraz spróbuj uruchomić test.bat
, ustawiając wartość %1
na foo bar
. (Zauważ, że pomiędzy foo
a bar
znajduje się znak spacji)
Próba i błąd przez kilka lat i zdaj sobie sprawę, że nie da się tego zrobić. Folks will suggest to escape using ^
, yet test.bat foo^ bar
will not output foo bar
.
So, there’s no way to get the output foo bar
, and the closest we can get is running test.bat foo" "bar
which produces foo" "bar
, or running test.bat "foo bar"
which produces "foo bar"
.
Powodem, dla którego pozostałe odpowiedzi pojawiają się do pracy jest to, że cd
robi własne dodatkowe parsowanie, odbiegające od zachowania zwykłego przekazywania argumentów (zwykłe %1
, %2
, %3
i inne w typowych plikach wsadowych).
Na przykład, weź pod uwagę osobliwe polecenie:
cd c:\documents and settings \some folder with spaces
Dlaczego to działa? Jest to spowodowane tym, że cd
self robi coś, co jest odpowiednikiem łączenia 7 usual argumentów w jeden logiczny. Zgodnie z normami przekazywania argumentów cmd widzimy 7 argumentów:
c:\documents
and
settings
\some
folder
with
spaces
It’s like though cd
has joined all the 7 arguments into one logical one, doing something like to array.join(" ")
, which produces the path:
c:\documents and settings \some folder with spaces
Note that this behaviour is peculiar to cd
only (and some other functions). Nie ma to nic wspólnego ze zwykłym przekazywaniem argumentów.
Rzeczywiście, cd
ma jeszcze jedną osobliwość. Pamiętasz, jak wyżej stwierdziliśmy, że nie mogliśmy uzyskać wyjścia foo bar
? Najbliższe wyjście, jakie możemy uzyskać, to:
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"
, lub:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
który produkuje """"f"""o""""o"" ""ba"""r""""""""""
.
Wszystkie powyższe przykłady mają jedno podobieństwo, które polega na tym, że wytworzą foo bar
po obcięciu znaków "
. cd
autor musiał zdać sobie z tego sprawę… gdybyśmy mieli wywnioskować z osobliwego zachowania cd
, które odcina wszystkie "
, które otrzymuje , pozwalając wszystkim tym komendom działać:
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