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