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