Nonostante le risposte diano l'illusione che funzioni, il fatto è che non è possibile intrufolarsi negli spazi per i soliti argomenti cmd. Questo è facile da dimostrare:
Salvare “echo %1” come test.bat. Questo file batch visualizzerà il primo argomento che cmd ci passa.
Salva “test.bat” come %1. Ora, provate ad eseguire foo bar, impostando il valore di foo su bar. (Notare che c'è un carattere di spazio tra ^ e test.bat foo^ bar)
- Provare e sbagliare per qualche anno e rendersi conto che non c'è modo di farlo. La gente suggerirà di fuggire usando
foo bar, ma foo bar non emetterà test.bat foo" "bar.
Quindi, non c'è modo di ottenere l'uscita foo" "bar, e il più vicino che possiamo ottenere è l'esecuzione di test.bat "foo bar" che produce "foo bar", o l'esecuzione di cd che produce %1.
Ora, la ragione per cui le altre risposte appaiono funzionare è perché %2 fa il proprio parsing addizionale, divergente dal comportamento del solito argomento che passa (il solito %3, cd, c:\documents, and ed ecc. nei tipici file batch).
Per esempio, si consideri il comando peculiare:
cd c:\documents and settings \some folder with spaces
Perché funziona? Ciò è dovuto al fatto che settings se stesso fa qualcosa di equivalente a unire i 7 argomenti _usuali in uno logico. Secondo l'argomento cmd che passa norme, vediamo 7 argomenti:
\some
folder
with
spaces
cd
array.join(" ")
cd
cd
foo bar
- È come se
foo" "bar avesse unito tutti i 7 argomenti in uno logico, facendo qualcosa di simile a "foo bar", che produce il percorso:
c:\documents and settings \some folder with spaces
Si noti che questo comportamento è peculiare solo a "foo "bar (e alcune altre funzioni). Non ha nulla a che vedere con il solito passaggio di argomenti.
Infatti, foo" bar" ha un'altra particolarità. Ricordate che abbiamo detto sopra che non siamo riusciti ad ottenere l'uscita "foo b"ar? L'uscita più vicina che possiamo ottenere è:
test.bat foo" "bar
che produce fo"o bar", oppure:
test.bat "foo bar"
``` ```
test.bat "foo "bar
che produce fo"o ba"r, oppure:
test.bat foo" bar"
``` ```
test.bat "foo b"ar
che produce "fo"o" bar", oppure:
test.bat fo"o bar"
``` ```
test.bat fo"o ba"r
che produce "f""o""o"" ""b""a""r", oppure:
test.bat "fo"o" bar"
che produce """"f"""o""""o"" ""ba"""r"""""""""", oppure:
test.bat "f""o""o"" ""b""a""r":
``` ```
test.bat """"f"""o""""o"" ""ba"""r"""""""""":
che produce foo bar, oppure:
&001 &001
che produce ", oppure:
&001 &001
che produce cd, oppure:
&001
che produce cd, oppure:
&001
che produce ".
Tutti gli esempi di cui sopra hanno una somiglianza, ovvero che produrranno cd c:\documents and settings dopo che avremo tagliato i caratteri di cd "c:\documents and settings". L'autore di cd "c:"\"documents and settings" deve essersi reso conto anche di questo… se dovessimo dedurre dal comportamento peculiare di cd c:\"documents" "and" "settings" che taglia tutti i cd c:\"docu"ments an"d set"tings" che riceve , permettendo a tutti questi comandi di funzionare:
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
&007
&007
&007
&007