A pesar de las respuestas que dan la ilusión de que funciona, el hecho es que no se puede colar en los espacios en los argumentos habituales de cmd. Esto es fácil de probar:
Guarda “echo %1
” como test.bat
. Este archivo por lotes emitirá el primer argumento que nos pase el cmd.
Ahora, intenta ejecutar test.bat
, estableciendo el valor de %1
a foo bar
. (Observe que hay un espacio entre foo
y bar
.)
Prueba y error durante unos años y date cuenta de que no hay manera de hacerlo. La gente sugerirá escapar usando ^
, pero test.bat foo^ bar
no producirá foo bar
.
Así que no hay forma de obtener la salida de foo bar
, y lo más cercano que podemos conseguir es correr test.bat foo" "bar
que produce foo" "bar
, o correr test.bat "foo bar"
que produce "foo bar"
.
Ahora, la razón por la que las otras respuestas aparecen funcionar es porque cd
hace su propio análisis sintáctico adicional, desviándose del comportamiento de paso de argumentos habitual (el habitual %1
, %2
, %3
y etc. en los típicos archivos por lotes).
Por ejemplo, consideremos el peculiar comando:
cd c:\documents and settings \some folder with spaces
¿Por qué funciona? Esto se debe a que cd
**se hace algo equivalente a unir los 7 argumentos habituales en uno lógico. Según las normas de paso de argumentos del cmd, vemos 7 argumentos:
c:\documents
and
settings
\some
folder
with
spaces
Es como si cd
hubiera unido los 7 argumentos en uno solo lógico, haciendo algo parecido a array.join(" ")
, lo que produce el camino:
c:\documents and settings \some folder with spaces
Nota que este comportamiento es peculiar sólo para cd
(y algunas otras funciones). No tiene nada que ver con el habitual paso de argumentos.
De hecho, cd
tiene otra peculiaridad. ¿Recuerda que dijimos antes que no podíamos obtener la salida foo bar
? La salida más cercana que podemos obtener es ejecutando:
test.bat foo" "bar
que produce foo" "bar
, o:
test.bat "foo bar"
que produce "foo bar"
, o:
test.bat "foo "bar
que produce "foo "bar
, o:
test.bat foo" bar"
que produce foo" bar"
, o:
test.bat "foo b"ar
que produce "foo b"ar
, o:
test.bat fo"o bar"
que produce fo"o bar"
, o:
test.bat fo"o ba"r
que produce fo"o ba"r
, o:
test.bat "fo"o" bar"
que produce "fo"o" bar"
, o:
test.bat "f""o""o"" ""b""a""r":
que produce "f""o""o"" ""b""a""r"
, o incluso:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
que produce """"f"""o""""o"" ""ba"""r""""""""""
.
Todos los ejemplos anteriores tienen una similitud, que es que producirán foo bar
después de recortar los caracteres de "
. El autor de cd
debe haberse dado cuenta de esto también… …si fuéramos a inferir del peculiar comportamiento de cd
que ** recortará todo "
que reciba** , permitiendo que todos estos comandos funcionen:
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