Malgré les réponses qui donnent l'illusion que ça marche, le fait est qu'on ne peut pas se faufiler dans les espaces pour trouver les arguments habituels des cmd. C'est facile à prouver :
Enregistrez “echo %1
” sous le nom de test.bat
. Ce fichier batch produira le premier argument que le cmd nous passera.
Maintenant, essayez de lancer test.bat
, en fixant la valeur de %1
à foo bar
. (Notez qu'il y a un espace entre foo
et bar
.)
Faites des essais et des erreurs pendant quelques années et réalisez que il n'y a pas moyen de le faire. Les gens vont suggérer de s'échapper en utilisant ^
, mais test.bat foo^ bar
ne produira pas foo bar
.
Donc, il n'y a aucun moyen d'obtenir la sortie foo bar
, et le plus proche que nous puissions obtenir est de faire fonctionner test.bat foo" "bar
qui produit foo" "bar
, ou de faire fonctionner test.bat "foo bar"
qui produit "foo bar"
. Maintenant, la raison pour laquelle les autres réponses apparaissent fonctionner est que cd
fait sa propre analyse additionnelle, divergeant du comportement des passages d'arguments habituels (les %1
, %2
, %3
et etc. dans les fichiers batch typiques).
Par exemple, considérons la commande particulière :
cd c:\documents and settings \some folder with spaces
Pourquoi fonctionne-t-elle ? Cela est dû au fait que cd
self fait quelque chose d'équivalent à la réunion des 7 arguments usuels en un seul logique. Selon les normes de passage des arguments du cmd, nous voyons 7 arguments :
c:\documents
and
settings
\some
folder
with
spaces
C'est comme si cd
avait réuni les 7 arguments en un seul, faisant quelque chose de semblable à array.join(" ")
, qui produit le chemin :
c:\documents and settings \some folder with spaces
Notez que ce comportement est spécifique à cd
seulement (et à quelques autres fonctions). Il n'a rien à voir avec le passage habituel des arguments.
En effet, cd
a une autre particularité. Rappelez-vous que nous avons dit plus haut que nous ne pouvions pas obtenir la sortie foo bar
? Le résultat le plus proche que nous pouvons obtenir est en exécutant :
test.bat foo" "bar
qui produit foo" "bar
, ou :
test.bat "foo bar"
qui produit "foo bar"
, ou :
test.bat "foo "bar
qui produit "foo "bar
, ou :
test.bat foo" bar"
qui produit foo" bar"
, ou :
test.bat "foo b"ar
qui produit "foo b"ar
, ou :
test.bat fo"o bar"
qui produit fo"o bar"
, ou :
test.bat fo"o ba"r
qui produit fo"o ba"r
, ou :
test.bat "fo"o" bar"
qui produit "fo"o" bar"
, ou :
test.bat "f""o""o"" ""b""a""r":
qui produit "f""o""o"" ""b""a""r"
, ou encore :
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
qui produit """"f"""o""""o"" ""ba"""r""""""""""
. Tous les exemples ci-dessus présentent une similitude, à savoir qu'ils produiront foo bar
après que nous ayons supprimé les caractères "
. L'auteur de cd
a dû s'en rendre compte lui aussi… si nous devions déduire du comportement particulier de cd
qui trippe tous les "
qu'il reçoit , permettant à toutes ces commandes de fonctionner :
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