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