Несмотря на ответы, создающие иллюзию, что это работает, факт в том, что вы не можете прокрасться в пространство в обычные аргументы в формате cmd. Это легко доказать:
Сохраните “echo %1” как test.bat. Этот пакетный файл выдаст первый аргумент, который нам передаст команда.
Теперь попробуйте запустить test.bat, установив значение %1 в foo bar. (Обратите внимание, что между foo и bar есть пробел.)
Пробейте несколько лет и поймите, что это невозможно**. Люди будут предлагать отказаться от использования ^, но test.bat foo^ bar не будет выводить foo bar.
Таким образом, нет никакого способа получить выход foo bar, и ближе всего мы можем получить, это запустить test.bat foo" "bar, которая производит foo" "bar, или запустить test.bat "foo bar", которая производит "foo bar".
Причина, по которой другие ответы кажутся работающими, заключается в том, что cd делает свой собственный дополнительный разбор, отличающийся от поведения обычной передачи аргументов (обычные %1, %2, %3 и т.д. в типичных пакетных файлах).
Например, рассмотрим особенную команду:
cd c:\documents and settings \some folder with spaces
Почему она работает? Это связано с тем, что cd itself делает нечто эквивалентное объединению 7 usual аргументов в один логический. Согласно нормам передачи аргументов cmd, мы видим 7 аргументов:
c:\documents
and
settings
\some
folder
with
-
spaces
cd
Как будто array.join(" ") объединил все 7 аргументов в один логический, делая что-то похожее на cd, что порождает путь:
c:\documents and settings \some folder with spaces
Заметьте, что это поведение специфично только для cd (и некоторых других функций). Оно не имеет ничего общего с обычной передачей аргументов.
Действительно, foo bar имеет еще одну особенность. Помните, мы говорили выше, что не можем получить результат foo" "bar? Ближайший результат мы можем получить, запустив:
test.bat foo" "bar
, который производит "foo bar", или:
test.bat "foo bar"
, который производит "foo "bar, или:
test.bat "foo "bar
, который производит foo" bar", или:
test.bat foo" bar"
, который производит "foo b"ar, или:
, который производит fo"o bar", или:
test.bat "foo b"ar
fo"o ba"r, или:
"fo"o" bar", или:
"f""o""o"" ""b""a""r", или:
test.bat fo"o bar"
""""f"""o""""o"" ""ba"""r"""""""""", или:
test.bat fo"o ba"r
, или:
foo bar.
Все вышеприведенные примеры имеют одно сходство, то есть они будут производить " после того, как мы обрезаем cd chars. Автор cd, должно быть, понял это тоже…. если мы будем делать вывод об особом поведении ", которое отсекает все 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
&007