显示从文本文件中的行批处理文件

问题描述:

文件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% 
+0

非常感谢你:如果延迟变量 扩充被启用,如下 如期运行上面的例子 可以写!你肯定会保存我的一天。 法比奥玻璃 – 2010-02-24 13:48:20