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

StackOverflow https://stackoverflow.com/questions/1694437

  •  18-09-2019
  •  | 
  •  

Вопрос

Я не знаю, как точно описать, что я пытаюсь сделать, но вот пример пакетного файла, который демонстрирует то, что я не могу понять.:

У меня есть пакетный файл. Внутри этого партийного файла я пытаюсь создать каталог:

Set CopyFrom = %~dp0

if Exist "%ProgramFiles(x86)" (
  Set TargetDir = %ProgramFiles(x86)%\My Directory Name has spaces
)

md %TargetDir%\NewSubFolder
copy %CopyFrom%\SourceFile.zip %TargetDir%\NewSubFolder

Мой пакетный файл сбой в строке 4 Set TargetDir =... с:

\My was unexpected at this time

Я предполагаю, что это потому, что у меня есть места в названии моего пути. Я думал, что смогу просто обернуть свою переменную цитатами:

Set TargetDir = "%ProgramFiles(x86)%\My Directory Name has spaces"

Но потом, когда я добираюсь до строки, которая создает каталог, он терпит неудачу, потому что %TargetDir% теперь завернут в цитаты. md "%TargetDir%"\NewSubFolder

Можно ли это исправить или я должен просто написать VBScript, чтобы разобраться с чем -то?

Это было полезно?

Решение

Просто поместите свое выражение в цитаты, как это:

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 Сам не нужны цитаты, кроме Когда его аргументы содержат особые символы, такие как <, >, |, & который сама оболочка Aready обрабатывает. Это не панацея, хотя, что делает ввод пользователя или содержимого файла, время от времени.

Кроме того, пожалуйста, никогда не ставят места вокруг = в set командование Это приведет к созданию переменной среды с помощью ее имя заканчивая в пространстве и его содержимое, начиная с пространства. Это было частично исправлено в Windows 7, молча создавая как переменную с пространством в конце, так и без:

> set foo = bar
> set foo
foo=bar
foo = bar

Но в предыдущих версиях Windows этого не произошло, поэтому никогда не использовали пространства вокруг = Если вы не знаете, это то, что вы хотите :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top