'Error in batch variable expansion with replacement containing parentheses

I have the following Batch script which replaces occurrences of {path} in a text file with a path:

@echo off
setlocal EnableDelayedExpansion

set myPath=C:\Program Files (x86)\foo

for /F "tokens=*" %%A in (template.txt) do (
    set line=%%A
    set line=!line:{path}=%myPath%!
    echo !line!
)

When I run this script I get the error message

\foo! was unexpected at this time.

If I remove the parentheses in the path it works as expected. How can I solve this problem? I cannot have quotes around the path in the text file so putting quotes around the path in the set statement is not an option.



Solution 1:[1]

Use set path=%ProgramFiles(x86)%\foo first (this folder may be elsewhere, this variable is here to find it anyway), and surround the replacement set with quotes (see below).

Corrected program:

@echo off
setlocal EnableDelayedExpansion

set pathval=%ProgramFiles(x86)%\foo

for /F "tokens=*" %%A in (template.txt) do (
    set line=%%A
    REM Please note the quotes around the affectation. It avoids an interpretation.
    set "line=!line:{path}=%pathval%!"
    echo !line!
)

Side note: even with setlocal, avoid to name a variable path...

Solution 2:[2]

@echo off
setlocal EnableDelayedExpansion

set "mypath=C:\Program Files (x86)\foo"

for /F "tokens=*" %%A in (q71593680.txt) do (
    set "line=%%A"
    CALL :changeline
    echo !line!
)

FOR %%c IN ("%mypath%") DO for /F "tokens=*" %%A in (q71593680.txt) do (
    set "line=%%A"
    set "line=!line:{path}=%%~c!"
    echo !line!
)

GOTO :EOF

:changeline
set "line=!line:{path}=%mypath%!"
GOTO :eof

The problem is that the ) in the substitution-string is being taken as the closing parenthesis of the do.

Solution : make an internal subroutine as shown.

Use set "var1=data" for setting string values - this avoids problems caused by trailing spaces.

Don't use path as a variablename - it's a reserved word in batch, meaning the sequence in which the directories are searched to find an executable that isn't in the current directory.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Wisblade
Solution 2