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