首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有setlocal的循环动态变量的批处理文件?

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

Stack Overflow用户
提问于 2013-12-04 02:43:45
回答 2查看 1.1K关注 0票数 0

我有一个简单的ini文件...实际上只是一个key=value文件,我想用它来设置我的脚本的变量。

我的ini文件:

代码语言:javascript
复制
DATABASE=snoopy

我的批处理文件编码

代码语言:javascript
复制
@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是正确的,它显示

代码语言:javascript
复制
a=DATABASE
b=snoopy

但在最后,当我在调用SET %%a=%%b之后回显%DATABASE%时,它仍然显示

代码语言:javascript
复制
DATABASE=woodstock

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

EN

回答 2

Stack Overflow用户

发布于 2013-12-04 04:09:55

嗯,不需要做任何事情来让它工作。

它起作用了。

您的问题是,当读取for块(代码中括号中的所有行)时,变量将被替换为它们的值,因此行echo %DATABASE%将转换为echo woodstock。但是该变量保存了在for循环中更改的正确值。试着把回声放在for之外,看看它的值是什么。

当一个块内的变量发生变化时,需要延迟扩展,并且必须访问同一块内发生变化的值。

票数 0
EN

Stack Overflow用户

发布于 2013-12-04 05:24:42

好的,我现在明白了..Had必须在文件顶部启用延迟扩展,而不仅仅是子例程调用。然后将%%a和%%b设置为延迟变量,并将它们设置为彼此相等,这是可行的。最终代码:

代码语言:javascript
复制
@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“

谢谢大家!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20359145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档