Trotz der Antworten, die die Illusion erwecken, dass es funktioniert, ist es Tatsache, dass man sich nicht durch Leerzeichen in die üblichen cmd-Argumente einschleichen kann. Dies ist leicht zu beweisen:
Speichern Sie “echo %1
” als test.bat
. Diese Batch-Datei wird das erste Argument ausgeben, das cmd uns übergibt:
Versuchen Sie nun, test.bat
auszuführen und den Wert von %1
auf foo bar
zu setzen. (Beachten Sie, dass zwischen foo
und bar
ein Leerzeichen steht.)
Versuchen Sie es ein paar Jahre lang und stellen Sie fest, dass es keine Möglichkeit gibt, es zu tun. Die Leute werden vorschlagen, die Verwendung von ^
zu vermeiden, doch test.bat foo^ bar
wird foo bar
nicht ausgeben.
Es gibt also keine Möglichkeit, die Ausgabe foo bar
zu erhalten, und am nächsten kommen wir, wenn wir test.bat foo" "bar
laufen lassen, was foo" "bar
erzeugt, oder wenn wir test.bat "foo bar"
laufen lassen, was "foo bar"
erzeugt.
Nun, der Grund, warum die anderen Antworten scheinen zu funktionieren, ist, weil cd
ein eigenes zusätzliches Parsing durchführt, das vom Verhalten der üblichen Argumentübergabe abweicht (das übliche %1
, %2
, %3
und usw. in typischen Batch-Dateien).
Betrachten Sie zum Beispiel den eigentümlichen Befehl:
cd c:\documents and settings \some folder with spaces
Warum funktioniert er? Das liegt daran, dass cd
selbst etwas tut, das dem Zusammenfügen der 7 üblichen Argumente zu einem logischen entspricht. Gemäß dem cmd-Argument, das Normen übergibt, sehen wir 7 Argumente:
c:\documents
and
settings
\some
folder
with
spaces
Es ist, als hätte cd
alle 7 Argumente zu einem logischen zusammengefügt und dabei etwas Ähnliches wie array.join(" ")
getan, was den Pfad ergibt:
c:\documents and settings \some folder with spaces
Beachten Sie, dass dieses Verhalten nur cd
eigentümlich ist (und einige andere Funktionen). Es hat nichts mit der üblichen Argumentübergabe zu tun.
Tatsächlich hat cd
eine weitere Besonderheit. Erinnern Sie sich, dass wir oben gesagt haben, dass wir die Ausgabe foo bar
nicht bekommen konnten? Am nächsten kommen wir der Ausgabe, wenn wir:
test.bat foo" "bar
ausführen, was foo" "bar
ergibt, oder:
test.bat "foo bar"
, was "foo bar"
ergibt, oder:
test.bat "foo "bar
, was "foo "bar
ergibt, oder:
test.bat foo" bar"
, was foo" bar"
ergibt, oder:
test.bat "foo b"ar
, was "foo b"ar
ergibt, oder:
test.bat fo"o bar"
, was fo"o bar"
ergibt, oder:
test.bat fo"o ba"r
, was fo"o ba"r
ergibt, oder:
test.bat "fo"o" bar"
, was "fo"o" bar"
ergibt, oder:
test.bat "f""o""o"" ""b""a""r":
, was "f""o""o"" ""b""a""r"
ergibt, oder sogar:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
, was """"f"""o""""o"" ""ba"""r""""""""""
ergibt.
Alle obigen Beispiele haben eine Ähnlichkeit, nämlich dass sie foo bar
erzeugen, nachdem wir die Zeichen "
abgeschnitten haben. Der Autor von cd
muss das auch erkannt haben… wenn wir aus dem eigentümlichen Verhalten von cd
schließen würden, das alle "
abschneidet, die es erhält , so dass all diese Befehle funktionieren:
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
&007