Apesar das respostas darem a ilusão de que funciona, o fato é que você não pode infiltrar espaços em argumentos comuns. Isso é fácil de provar:
-
Salve " echo %1
" como test.bat
. Este arquivo em lote gerará o primeiro argumento que o cmd nos passa.
-
Agora, experimente e execute test.bat
, definindo o valor de %1
para foo bar
. (Observe que há um caractere de espaço entre foo
e bar
.)
-
Teste e erro por alguns anos e perceba que não há como fazer isso . As pessoas vão sugerir a fuga usando ^
, mas test.bat foo^ bar
não produzirá foo bar
.
Portanto, não é possível obter a saída foo bar
, e o mais próximo que podemos obter é executar test.bat foo" "bar
, que produz foo" "bar
ou executar test.bat "foo bar"
, que produz "foo bar"
.
Agora, a razão pela qual as outras respostas aparecem para o trabalho é porque cd
faz sua própria análise adicional, divergindo do comportamento da passagem usual de argumentos (a usual %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? Isto é devido a cd
propriamente dito fazendo algo equivalente a juntar os 7 usuais argumentos em um argumento lógico. De acordo com o argumento cmd, passando as normas, vemos 7 argumentos:
-
c:\documents
-
and
-
settings
-
\some
-
folder
-
with
-
spaces
É como se cd
tivesse juntado todos os 7 argumentos em um argumento lógico, fazendo algo parecido com array.join(" ")
, que produz o caminho:
c:\documents and settings \some folder with spaces
Observe que esse comportamento é peculiar a cd
only (e algumas outras funções). Não tem nada a ver com a discussão usual.
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 mesmo:
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
que produz """"f"""o""""o"" ""ba"""r""""""""""
.
Todos os exemplos acima têm uma semelhança, que é produzir foo bar
depois de compensarmos os caracteres "
. O autor de cd
deve ter percebido isso também ... se inferirmos do comportamento peculiar de cd
que apaga todos os "
que ele recebe , permitindo que todos esses comandos trabalho:
-
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