Apesar das respostas que dão a ilusão de que funciona, o fato é que você não pode se infiltrar nos espaços nos argumentos usuais do cmd. É fácil provar:
Salvar " echo %1
" como test.bat
. Este arquivo em lotes produzirá o primeiro argumento que o cmd nos passa.
Agora, tente executar test.bat
, definindo o valor de %1
para foo bar
. (Observe que há um caractere de espaço entre foo
e bar
.)
Tente e tente por alguns anos e perceba que não há como fazê-lo . As pessoas sugerem que você evite usar ^
, mas test.bat foo^ bar
não produzirá foo bar
.
Portanto, não há como obter a saída foo bar
, e o mais próximo que podemos chegar é executando o test.bat foo" "bar
que produz foo" "bar
ou executando o test.bat "foo bar"
que produz "foo bar"
.
Agora, a razão as outras respostas aparecem para trabalhar é porque cd
faz a sua própria análise adicional, divergindo do comportamento de argumento usual de passagem (o habitual %1
, %2
, %3
e etc em arquivos em lote típicos).
Por exemplo, considere o comando peculiar:
cd c:\documents and settings \some folder with spaces
Por que isso funciona? Isso se deve ao fato de cd
ele fazer algo equivalente a unir os 7 argumentos usuais em um argumento lógico. De acordo com o cmd que passa normas, vemos 7 argumentos:
c:\documents
and
settings
\some
folder
with
spaces
É como se cd
juntasse todos os 7 argumentos em um argumento lógico, fazendo algo parecido com o array.join(" ")
que produz o caminho:
c:\documents and settings \some folder with spaces
Observe que esse comportamento é peculiar cd
apenas (e algumas outras funções). Não tem nada a ver com a passagem usual de argumentos.
De fato, cd
tem outra peculiaridade. Lembre-se de que afirmamos acima que não conseguimos obter a saída foo bar
? A saída mais próxima que podemos 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 até:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
que produz """"f"""o""""o"" ""ba"""r""""""""""
.
Todos os exemplos acima têm uma semelhança: eles produzirão foo bar
depois que apararmos os "
caracteres. cd
O autor de deve ter percebido isso também ... se deduzíssemos do cd
comportamento peculiar de que apara tudo o "
que recebe , permitindo que todos esses 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