Ответ 1
Вы можете использовать два разных способа.
Использовать расширенный синтаксис set
с кавычками set "var=content"
будет устанавливать var с содержимым,
контент цитируется, поэтому специальные символы не являются проблематичными, и он использует контент до последней цитаты (без самой цитаты).
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set "PATH=%a%"
)
Используйте задержанное расширение (например, ответ shf301), но также передайте значение в основной объем.
@echo off
setlocal enabledelayedexpansion
set a=some value with (parentheses) inside
if 1 == 1 (
set "localScope_PATH=!a!"
rem now transfer it to the global scope
FOR /F "delims=" %%A in ("!localScope_PATH!") DO (
endlocal
set "path=%%A"
)
)
В этом случае расширенный синтаксис не нужен, я использовал его только для того, чтобы избежать скрытых пространств в конце строки.
EDIT: Могу ли я объединить это с setlocal EnableDelayedExpansion и использовать! вместо% lazy оценить значение переменной? Когда я попробовал, я получил)! было неожиданным в настоящее время.
Вы можете, но это непротиворечиво, поскольку
@echo off
Setlocal EnableDelayedExpansion
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=!a:^)=^^^)!
set path
)
Затем ваш путь содержит каретки перед )
как
C:\programs (x86^)
Чтобы понять, как работает расширение, вы можете прочитать SO: Как интерпретатор сценариев Windows Command Interpreter (CMD.EXE)?
EDIT2: больше проблем с контуром (содержащие кавычки)
В соответствии с этим question может возникнуть другая проблема с круглыми скобками, когда путь содержит кавычки.
Пример path="C:\Program Files (x86)";C:\Program Files (x86)\Skype
Это разрешено, даже не обязательно использовать кавычки здесь, но это разрушает расширенный синтаксис set
, так как теперь set "newPath=%path%"
расширяется до
set "newPath="C:\Program Files (x86)";C:\Program Files (x86)\Skype"
Теперь, по крайней мере, одна скобка не находится внутри кавычек и может сломать командный блок.
Но вы можете просто удалить все кавычки из переменной пути, как сказано, цитаты здесь не нужны.
set "newPath=%path:"=%"