我有一个简单的ini文件...实际上只是一个key=value文件,我想用它来设置我的脚本的变量。
我的ini文件:
DATABASE=snoopy我的批处理文件编码
@echo off
SET DATABASE=woodstock
FOR /f "tokens=1,2 delims==" %%a in ('C:\mycfg.ini') do (
echo a=%%a
echo b=%%b
pause
SET %%a=%%b
ECHO DATABASE=%DATABASE%
)回声a和b是正确的,它显示
a=DATABASE
b=snoopy但在最后,当我在调用SET %%a=%%b之后回显%DATABASE%时,它仍然显示
DATABASE=woodstock如果我使用延迟扩展,它只能在本地工作。我需要它来覆盖全局,所以我看不出为什么这不应该工作。
发布于 2013-12-04 04:09:55
嗯,不需要做任何事情来让它工作。
它起作用了。
您的问题是,当读取for块(代码中括号中的所有行)时,变量将被替换为它们的值,因此行echo %DATABASE%将转换为echo woodstock。但是该变量保存了在for循环中更改的正确值。试着把回声放在for之外,看看它的值是什么。
当一个块内的变量发生变化时,需要延迟扩展,并且必须访问同一块内发生变化的值。
发布于 2013-12-04 05:24:42
好的,我现在明白了..Had必须在文件顶部启用延迟扩展,而不仅仅是子例程调用。然后将%%a和%%b设置为延迟变量,并将它们设置为彼此相等,这是可行的。最终代码:
@echo off
SetLocal EnableDelayedExpansion
SET DATABASE=woodstock
FOR /f "tokens=1,2 delims==" %%a in ('C:\mycfg.ini') do (
set tmpA=%%a
set tmpB=%%b
SET !tmpA!=!tmpB!
)
ECHO DATABASE=%DATABASE%然后它就变成了"snoopy“
谢谢大家!
https://stackoverflow.com/questions/20359145
复制相似问题