Batch file 在批处理文件中显示文本文件中的行
文件test.cmd: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
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%