Ondanks de antwoorden die de illusie wekken dat het werkt, is het een feit dat je niet in de gebruikelijke cmd-argumenten kunt sluipen. Dit is gemakkelijk te bewijzen:
Sla “echo %1” op als test.bat. Dit batch-bestand zal het eerste argument dat cmd ons passeert uitvoeren.
Probeer nu test.bat uit te voeren en stel de waarde van %1 in op foo bar. (Merk op dat er een spatiegrafiek is tussen foo en bar.)
- Probeer het een paar jaar lang en realiseer je dat er geen manier is om het te doen. Mensen zullen suggereren om te ontsnappen met behulp van
^, maar test.bat foo^ bar zal foo bar niet uitvoeren.
Dus, er is geen manier om de uitvoer foo bar te krijgen, en het dichtstbijzijnde wat we kunnen krijgen is draaiende test.bat foo" "bar die foo" "bar produceert, of draaiende test.bat "foo bar" die "foo bar" produceert.
Nu, de reden dat de andere antwoorden verschijnen te werken is omdat cd het eigen extra parseren doet, afwijkend van het gedrag van het gebruikelijke passeren van argumenten (het gebruikelijke %1, %2, %3 en etc in typische batch-bestanden).
Bijvoorbeeld, denk aan het eigenaardige commando:
cd c:\documents and settings \some folder with spaces
Waarom werkt het? Dit komt doordat cd ** zichzelf** iets gelijkwaardigs doet aan het samenvoegen van de 7 gebruikelijke argumenten tot één logische. Volgens cmd argument passerende normen zien we 7 argumenten:
c:\documents
and
settings
\some
folder
with
spaces
cd
Het is alsof array.join(" ") alle 7 argumenten heeft samengevoegd tot één logische, die iets doet met cd, wat het pad produceert:
c:\documents and settings \some folder with spaces
Noteer dat dit gedrag specifiek is voor cd alleen (en enkele andere functies). Het heeft niets te maken met de gebruikelijke argumentatie die voorbijgaat.
Inderdaad, foo bar heeft nog een andere eigenaardigheid. Weet je nog dat we hierboven zeiden dat we de uitgang foo" "bar niet konden krijgen? De dichtstbijzijnde output die we kunnen krijgen is door te draaien:
test.bat foo" "bar
die "foo bar" produceert, of:
test.bat "foo bar"
die "foo "bar produceert, of:
test.bat "foo "bar
die foo" bar" produceert, of:
test.bat foo" bar"
die "foo b"ar produceert, of:
test.bat "foo b"ar
die fo"o bar" produceert, of:
test.bat fo"o bar"
die fo"o ba"r produceert, of:
test.bat fo"o ba"r
die "fo"o" bar" produceert, of:
test.bat "fo"o" bar"
die "f""o""o"" ""b""a""r" produceert, of:
test.bat "f""o""o"" ""b""a""r":
die """"f"""o""""o"" ""ba"""r"""""""""" produceert, of zelfs:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
die foo bar produceert.
Alle bovenstaande voorbeelden hebben één overeenkomst, namelijk dat ze " produceren nadat we de cd chars hebben afgeknipt. cd‘s auteur moet zich dit ook gerealiseerd hebben… als we uit "’s eigenaardige gedrag zouden afleiden dat ** alle cd c:\documents and settings die het ontvangt afknipte** , waardoor al deze commando’s kunnen werken:
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
&007
&007