替换包含括号的批量变量扩展错误
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
...
我有以下批处理脚本,它用路径替换文本文件中出现的 {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
...