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