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