Scripting 关于windows批处理文件的奇怪问题

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

我在我的工作目录中找到了1.txt2.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_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,也请查看,它有很多有用的东西。