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