Batch file 在批处理文件中显示文本文件中的行

Batch file 在批处理文件中显示文本文件中的行,batch-file,Batch File,文件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包含以下行(每行一个名称): 每次启动此批时,我都会得到以下输出: i: John name: dummy i:T om name: dummy i: Erica name: dummy

文件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包含以下行(每行一个名称):


每次启动此批时,我都会得到以下输出:

i: John  
name: dummy  
i:T om  
name: dummy  
i: Erica  
name: dummy  
i: Sara  
name: dummy  
变量名似乎没有被赋值为
%%i


有什么想法吗?

您陷入了不使用延迟扩展的旧陷阱

为了快速修复,只需将

setlocal enabledelayedexpansion
在批处理文件中循环之前,使用
!名字而不是
%name%

CMD在解析命令时展开变量。从这个意义上讲,命令是一行或一个“块”,用括号分隔。完整的
for
循环只被解析一次,在该阶段
%name%
被替换为它在该点上的值,即
“dummy”
。另一方面,延迟扩展使用
而不是
%
来分隔变量名,然后在执行命令之前展开变量

无论何时在圆括号内设置变量并在同一块中再次使用其值,都需要使用延迟展开<代码>帮助集
还提供了一些有关这方面的信息:

延迟环境变量展开 有助于绕过 当前扩张的局限性 当一行文本被删除时会发生这种情况 读取,而不是在执行时读取。这个 下面的示例演示 立即变量问题 扩展:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)
不会显示该消息,因为 如果
语句中的
%VAR%
是 当第一个
IF
语句被读取,因为它符合逻辑 包括
IF
的主体,即 复合陈述。因此,
IF
复合语句的内部是 真的比较“之前”和“之后” 这永远不会是平等的。同样地, 下面的示例将不起作用 预期:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
因为它不会建立一个 当前目录中的文件,但 而是只设置
列表
变量设置为找到的最后一个文件。 同样,这是因为
%LIST%
是 当
FOR的 语句被读取,此时
列表
变量为空。所以 我们正在执行的循环的实际
是:

for %i in (*) do set LIST= %i
只需将
列表
设置为 找到最后一个文件

延迟环境变量展开 允许您使用不同的 字符(感叹号)到 在以下位置展开环境变量: 执行时间。If延迟变量 如果启用了扩展,请执行上述操作 举例如下 按计划工作:

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%

非常感谢你!你救了我一天。法比奥维塔莱酒店
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%