Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to escape variables with parentheses inside if-clause in a batch file?

Tags:

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?

like image 714
Piotr Dobrogost Avatar asked Oct 19 '11 18:10

Piotr Dobrogost


People also ask

What is %1 in a batch file?

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.

Can you use if statements in batch files?

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.

How do I escape a character in CMD?

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.)


1 Answers

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:"=%" 
like image 74
jeb Avatar answered Sep 18 '22 06:09

jeb