显示从文本文件中的行批处理文件
问题描述:
文件TEST.CMD:显示从文本文件中的行批处理文件
name=dummy
for /f "eol=; tokens=1 delims=," %%i in (list.txt) do (
echo i: %%i
set name=%%i
echo name: %name%)
文件LIST.TXT包含此行(每行一个名称):
John
Tom
Erica
Sara
每时间我推出这批我得到这个输出:
i: John
name: dummy
i:T om
name: dummy
i: Erica
name: dummy
i: Sara
name: dummy
看来,变异能够得到的名称未得到赋值%%i
任何想法?
答
你正陷入不使用延迟扩展的旧陷阱。
为了速战速决,只要把
这个循环之前,您的批处理文件,并使用!name!
代替%name%
。
CMD在解析命令时展开变量。在这个意义上,命令是单行或“块”,用括号分隔。完整的for
循环仅被解析一次,并且在那个阶段%name%
被替换为当时具有的值,即"dummy"
。另一方面,延迟扩展使用!
而不是%
来定义变量名称,然后在执行命令之前将变量扩展。
无论您何时在括号内的块内设置变量和再次在同一个块中使用其值,您需要使用延迟扩展。 help set
也有一些有关此信息:
延迟的环境变量扩展 是围绕当前扩大 当一行文字是 读,而不是执行的时候恰好的 局限性越来越有用。所述 下面的示例演示 问题立即可变 扩展:
set VAR=before if "%VAR%" == "before" ( set VAR=after if "%VAR%" == "after" @echo If you see this, it worked )
绝不会显示该消息,因为 的
%VAR%
在两个IF
语句是 取代的当读取第一IF
语句,因为它在逻辑上 包括IF
的正文,这是 的复合语句。所以IF
内的复合语句是 真正比较“之前”与“之后” 哪个永远不会相等。同样, 下面的例子将无法正常工作 预期:set LIST= for %i in (*) do set LIST=%LIST% %i echo %LIST%
,它会不建立的 文件的列表,在当前目录中,但 反而会刚刚设置的
LIST
变量找到的最后一个文件。 同样,这是因为%LIST%
是 扩展一次当FOR
语句被读取,并在那个时候LIST
变量为空。因此,我们正在执行 实际FOR
循环是:for %i in (*) do set LIST= %i
它只是不断设置
LIST
对发现的 最后一个文件。延迟的环境变量扩展 允许你使用一个不同的 字符(惊叹号)来 在 执行时间扩充环境变量。
set VAR=before if "%VAR%" == "before" ( set VAR=after if "!VAR!" == "after" @echo If you see this, it worked ) set LIST= for %i in (*) do set LIST=!LIST! %i echo %LIST%
非常感谢你:如果延迟变量 扩充被启用,如下 如期运行上面的例子 可以写!你肯定会保存我的一天。 法比奥玻璃 – 2010-02-24 13:48:20