Apesar das respostas darem a ilusão de que funciona, o facto é que não se pode esgueirar em espaços para os habituais argumentos cmd. Isto é fácil de provar:
Guarde “echo %1
” como test.bat
. Este ficheiro de lote irá produzir o primeiro argumento que o cmd nos passa.
Agora, tente executar test.bat
, definindo o valor de %1
para foo bar
. (Note que existe um valor de espaço entre foo
e bar
.)
Tentativa e erro durante alguns anos e percebe que não há forma de o fazer*. As pessoas vão sugerir que se escape usando ^
, no entanto test.bat foo^ bar
não produzirá foo bar
.
Portanto, não há maneira de obter a produção foo bar
, e o mais próximo que podemos obter é correr test.bat foo" "bar
que produz foo" "bar
, ou correr test.bat "foo bar"
que produz "foo bar"
.
Agora, a razão pela qual as outras respostas appear a trabalhar é porque o cd
faz ** é próprio**, divergindo do comportamento de passar o argumento habitual (os %1
, %2
, %3
e etc em ficheiros batch típicos).
Por exemplo, considere o comando peculiar:
cd c:\documents and settings \some folder with spaces
Porque é que funciona? Isto deve-se ao facto de cd
seu próprio fazer algo equivalente a juntar os 7 usuais argumentos num único lógico. De acordo com as normas de passagem de argumentos cmd, vemos 7 argumentos:
c:\documents
and
settings
\some
folder
with
spaces
É como se cd
tivesse juntado todos os 7 argumentos num único lógico, fazendo algo semelhante a array.join(" ")
, que produz o caminho:
c:\documents and settings \some folder with spaces
Note-se que este comportamento é peculiar a cd
apenas (e algumas outras funções). Não tem nada a ver com a habitual passagem de argumentos.
De facto, cd
tem outra peculiaridade. Lembra-se de termos dito acima que não conseguíamos obter o resultado foo bar
? A produção mais próxima que conseguimos obter é executando:
test.bat foo" "bar
que produz foo" "bar
, ou:
test.bat "foo bar"
que produz "foo bar"
, ou:
test.bat "foo "bar
que produz "foo "bar
, ou:
test.bat foo" bar"
que produz foo" bar"
, ou:
test.bat "foo b"ar
que produz "foo b"ar
, ou:
test.bat fo"o bar"
que produz fo"o bar"
, ou:
test.bat fo"o ba"r
que produz fo"o ba"r
, ou:
test.bat "fo"o" bar"
que produz "fo"o" bar"
, ou:
test.bat "f""o""o"" ""b""a""r":
que produz "f""o""o"" ""b""a""r"
, ou ainda:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
que produz """"f"""o""""o"" ""ba"""r""""""""""
.
Todos os exemplos acima têm uma semelhança, que é que eles vão produzir foo bar
depois de apararmos os "
chars. O autor de cd
também deve ter percebido isto… se quiséssemos inferir a partir do comportamento peculiar de cd
que dispõe todos os "
que recebe , permitindo que todos estes comandos funcionem:
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