替换包含括号的批量变量扩展错误

Error in batch variable expansion with replacement containing parentheses

我有以下批处理脚本,它用路径替换文本文件中出现的 {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!
)

当我运行这个脚本时,我收到错误消息

\foo! was unexpected at this time.

如果我删除路径中的括号,它将按预期工作。我怎么解决这个问题?我不能在文本文件中的路径周围加上引号,所以在 set 语句中的路径周围放置引号不是一个选项。

@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

问题是 substitution-string 中的 ) 被当作 do 的右括号。

解决方案:制作一个内部子程序,如图所示。

使用 set "var1=data" 设置字符串值 - 这避免了尾随空格引起的问题。

不要使用 path 作为变量名 - 它是批处理中的保留字,表示搜索目录以查找不在当前目录中的可执行文件的顺序。

先用set path=%ProgramFiles(x86)%\foo(这个文件夹可能在别的地方,反正这个变量就在这里找),把替换的set用引号括起来(见下文)。

更正的程序:

@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!
)

旁注:即使使用 setlocal,也要避免将变量命名为 path...