Несмотря на ответы, создающие иллюзию, что это работает, факт в том, что вы не можете прокрасться в пространство в обычные аргументы в формате 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