没有setlocal的文件循环动态变量的批处理文件?

时间:2013-12-03 18:43:45

标签: batch-file for-loop global-variables

我有一个简单的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

如果我使用延迟扩展,它只能在本地使用。我需要它来覆盖全局,所以我不明白为什么这不起作用。

2 个答案:

答案 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%

并将其改为“史努比”

全部谢谢!