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

时间:2011-03-18 07:23:34

标签: 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_variable=2.txt   <---------------why it is not 1.txt here??
filename=1.txt
---------------
file_variable=2.txt
filename=2.txt

感谢。

2 个答案:

答案 0 :(得分:6)

你需要把:

@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_variable%替换为所持有的值。使用延迟扩展会延迟评估,直到执行实际行。


Rob van der Woude's site有各种各样出色的Windows脚本技巧,包含了很多不同的Windows操作方式和各种工具。

答案 1 :(得分:1)

在这种特殊情况下,如果你像这样ECHOed file_variable,你可以获得正确的输出:

CALL ECHO file_variable=%%file_variable%%

@paxdiablo的答案中描述的方法相比,这种方法不够灵活,可能性能较差。它可能只是一种延迟变量扩展的快速而肮脏的方法,而无需为其启用特殊语法。