Scripting 关于windows批处理文件的奇怪问题
我在我的工作目录中找到了1.txt和2.txt。我使用下面的批来列出所有文件 批次为:Scripting 关于windows批处理文件的奇怪问题,scripting,batch-file,cmd,Scripting,Batch File,Cmd,我在我的工作目录中找到了1.txt和2.txt。我使用下面的批来列出所有文件 批次为: @echo off for /f "tokens=*" %%a in ('dir *.txt /b') do ( echo --------------- set file_variable=%%a echo file_variable=%file_variable% echo filename=%%a ) 结果如下: --------------- file
@echo off
for /f "tokens=*" %%a in ('dir *.txt /b') do (
echo ---------------
set file_variable=%%a
echo file_variable=%file_variable%
echo filename=%%a
)
结果如下:
---------------
file_variable=2.txt <---------------why it is not 1.txt here??
filename=1.txt
---------------
file_variable=2.txt
filename=2.txt
---------------
file_variable=2.txt您需要放入:
@setlocal enableextensions enabledelayedexpansion
在文件的顶部,然后
endlocal
最后
然后需要使用延迟扩展替换字符
@setlocal enableextensions enabledelayedexpansion
@echo off
for /f "tokens=*" %%a in ('dir *.txt /b') do (
echo ---------------
set file_variable=%%a
echo file_variable=!file_variable!
echo filename=%%a
)
endlocal
C:\Documents and Settings\Pax\My Documents> qq.cmd
---------------
file_variable=1.txt
filename=1.txt
---------------
file_variable=2.txt
filename=2.txt
在没有延迟扩展的情况下,您看到的是,整个for
循环在运行之前正在进行评估。这包括替换,因此%file\u variable%
将替换为循环开始前保留的值。使用延迟扩展将推迟计算,直到执行实际行
在上有各种精彩的Windows脚本技巧,其中包含了许多在Windows下使用各种工具进行操作的不同方法。在这种情况下,如果您像这样回显文件变量,您可以获得正确的输出:
CALL ECHO file_variable=%%file_variable%%
这种方法不如的答案中描述的方法灵活,性能也可能不如的方法。这可能只是一种快速而肮脏的延迟变量扩展的方法,而不需要为此启用特殊语法。@smwikipedia:这同样适用于其他情况,在这些情况下,您必须使用括号中包含的命令块,如if。。。(…)否则(…)
。这两者之间有什么官方文件的区别吗!变量还有%variable%notations?@smwikipedia,也请查看,它有很多有用的东西。