Как я устанавливаю переменную среды на значение с пробелами в пакетном файле?

Я честно сомневаюсь относительно него, по ряду причин, но самый важный - то, что существуют некоторые инструкции, которые позволяются в 32-разрядном режиме, но не в 64-разрядном режиме. А именно, префикс REX, который используется для кодирования некоторых инструкций и регистров в 64-разрядном режиме, является байтом формы 0x4f:0x40, но в режиме на 32 бита тот же байт является или INC или DEC с фиксированным операндом.
из-за этого, любая 64-разрядная инструкция, которая снабжается префиксом REX, будет интерпретироваться или как INC или как DEC, и не даст VMM шанс эмулировать 64-разрядную инструкцию (например, путем передачи сигналов о неопределенном исключении кода операции).

единственный способ, которым это могло бы быть сделано, состоит в том, чтобы использовать исключение прерывания для возврата к VMM после каждой инструкции так, чтобы это видело, нужна ли этому специальная 64-разрядная обработка. Я просто не вижу того случая.

6
задан texnezio 12 April 2016 в 00:28
поделиться

2 ответа

Просто заключите ваше выражение в кавычки, например:

C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces"
C:\>echo %TargetDir%
C:\Program Files\My Directory Name has spaces

Примечание: оно расширит переменную в кавычках, и если в нем тоже есть пробелы, его нужно будет заключить в кавычки.

Теперь вы можете процитировать его для выполнения вашей операции:

md "%TargetDir%\NewSubFolder"
6
ответ дан 16 December 2019 в 21:41
поделиться

Проблема, о которой идет речь, не пробелы, как предлагали другие, а скорее закрывающая скобка в переменной среды 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 этого не происходило, поэтому просто никогда не используйте пробелы вокруг = ], если вы не знаете, что хотите: -)

2
ответ дан 16 December 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: