我有一个简单的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
如果我使用延迟扩展,它只能在本地使用。我需要它来覆盖全局,所以我不明白为什么这不起作用。
答案 0 :(得分:0)
嗯,没有必要做任何事情来使它工作。
有效。
您的问题是,当for
块(代码中括号中的所有行)被读取时,变量将替换为它们的值,因此行echo %DATABASE%
将转换为echo woodstock
}。但变量保持正确的值,在for
循环内更改。尝试将回声放在for之外,看看它是什么。
在块内更改变量时需要延迟扩展,并且必须访问同一块内的更改值。
答案 1 :(得分:0)
好的我现在得到了.. 必须在文件顶部启用延迟扩展,而不是仅在子例程调用上启用。然后将%% 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%
并将其改为“史努比”
全部谢谢!