Running this batch file
@echo off set a=some value with (parentheses) inside if 1 == 1 ( set PATH=%a% )
gives inside was unexpected at this time.
error.
How to escape a
variable to avoid this error?
When used in a command line, script, or batch file, %1 is used to represent a variable or matched string. For example, in a Microsoft batch file, %1 can print what is entered after the batch file name.
One of the common uses for the 'if' statement in Batch Script is for checking variables which are set in Batch Script itself. The evaluation of the 'if' statement can be done for both strings and numbers.
In the Command Prompt, the caret character ( ^ ) will let you escape spaces—in theory. Just add it before each space in the file name. (You'll find this character in the number row on your keyboard. To type the caret character, press Shift+6.)
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.
Samplepath="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:"=%"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With