Я честно сомневаюсь относительно него, по ряду причин, но самый важный - то, что существуют некоторые инструкции, которые позволяются в 32-разрядном режиме, но не в 64-разрядном режиме. А именно, префикс REX, который используется для кодирования некоторых инструкций и регистров в 64-разрядном режиме, является байтом формы 0x4f:0x40, но в режиме на 32 бита тот же байт является или INC или DEC с фиксированным операндом.
из-за этого, любая 64-разрядная инструкция, которая снабжается префиксом REX, будет интерпретироваться или как INC или как DEC, и не даст VMM шанс эмулировать 64-разрядную инструкцию (например, путем передачи сигналов о неопределенном исключении кода операции).
единственный способ, которым это могло бы быть сделано, состоит в том, чтобы использовать исключение прерывания для возврата к VMM после каждой инструкции так, чтобы это видело, нужна ли этому специальная 64-разрядная обработка. Я просто не вижу того случая.
Просто заключите ваше выражение в кавычки, например:
C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces"
C:\>echo %TargetDir%
C:\Program Files\My Directory Name has spaces
Примечание: оно расширит переменную в кавычках, и если в нем тоже есть пробелы, его нужно будет заключить в кавычки.
Теперь вы можете процитировать его для выполнения вашей операции:
md "%TargetDir%\NewSubFolder"
Проблема, о которой идет речь, не пробелы, как предлагали другие, а скорее закрывающая скобка в переменной среды ProgramFiles (x86)
Это вызывает синтаксическому анализатору кажется, что блок заканчивается преждевременно ( бессовестная самореклама ).
Цитаты действительно помогают в этом случае, потому что они заставляют синтаксический анализатор перепрыгивать через всю цитируемую часть и правильно Предположим, что следующие круглые скобки фактически закрывают. но исправить это может быть намного проще:
if Exist "%ProgramFiles(x86)%" Set TargetDir=%ProgramFiles(x86)%\My Directory Name has spaces
Зачем вообще использовать заключенный в скобки блок, если все, что вы делаете, помещает в него ровно одну команду?
Сам set
не требует кавычек, кроме , когда его аргументы содержат специальные символы, такие как <
, >
, |
, &
, который непосредственно обрабатывает оболочка. Это не панацея, хотя временами затрудняет правильную обработку пользовательского ввода или содержимого файла.
Кроме того, никогда не помещайте пробелы вокруг =
в наборе
команда. Это приведет к созданию переменной среды с ее именем , заканчивающимся пробелом, и содержимым, начинающимся с пробела. Это было частично исправлено в Windows 7 путем создания переменной с пробелом в конце и без него:
> set foo = bar
> set foo
foo=bar
foo = bar
Но в предыдущих версиях Windows этого не происходило, поэтому просто никогда не используйте пробелы вокруг =
], если вы не знаете, что хотите: -)
Также никогда не ставьте пробелы вокруг =
в команде set
. Это приведет к созданию переменной среды с ее именем , заканчивающимся пробелом, и содержимым, начинающимся с пробела. Это было частично исправлено в Windows 7 путем создания переменной с пробелом в конце и без него:
> set foo = bar
> set foo
foo=bar
foo = bar
Но в предыдущих версиях Windows этого не происходило, поэтому просто никогда не используйте пробелы вокруг =
], если вы не знаете, что хотите: -)
Также никогда не ставьте пробелы вокруг =
в команде set
. Это приведет к созданию переменной среды с ее именем , заканчивающимся пробелом, и содержимым, начинающимся с пробела. Это было частично исправлено в Windows 7 путем создания переменной с пробелом в конце и без него:
> set foo = bar
> set foo
foo=bar
foo = bar
Но в предыдущих версиях Windows этого не происходило, поэтому просто никогда не используйте пробелы вокруг =
], если вы не знаете, что хотите: -)