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