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