You can use two different ways
Use the extended syntax of set
with quotes set "var=content"
will set var with content,
content is quoted so special characters aren't problematic and it uses the content till the last quote (without the quote itself)
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set "PATH=%a%"
)
Use delayed expansion (like the answer of shf301) but also transfer the value to the main scope.
@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"
)
)
In this case the extended set-syntax is not necessary, I used it only to avoid hidden spaces at the line end.
EDIT:
Can I combine this with setlocal EnableDelayedExpansion and using ! instead of % to lazy evaluate variable's value? When I tried I got )! was unexpected at this time.
You can, but it's contra productive, as
@echo off
Setlocal EnableDelayedExpansion
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=!a:^)=^^^)!
set path
)
Then your path contains carets in front of the )
like
C:programs (x86^)
To understand how expansion works you can read SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?
EDIT2: More problems with the path (containing quotes)
According to this question there can occour another problem with parenthesis when the path contains quotes.
Sample
path="C:Program Files (x86)";C:Program Files (x86)Skype
This is allowed, even it's not necessary to use quotes here, but this destroys the extended SET
syntax, as now set "newPath=%path%"
expands to
set "newPath="C:Program Files (x86)";C:Program Files (x86)Skype"
Now at least one parenthesis is not inside quotes and is able to break a command block.
But you can simply remove all quotes from the path variable, as said, quotes aren't necessary here.
set "newPath=%path:"=%"