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

smw*_*dia 2 scripting cmd batch-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
    )    
Run Code Online (Sandbox Code Playgroud)

结果如下:

---------------
file_variable=2.txt   <---------------why it is not 1.txt here??
filename=1.txt
---------------
file_variable=2.txt
filename=2.txt
Run Code Online (Sandbox Code Playgroud)

谢谢.

pax*_*blo 6

你需要把:

@setlocal enableextensions enabledelayedexpansion
Run Code Online (Sandbox Code Playgroud)

在您的文件的顶部和

endlocal
Run Code Online (Sandbox Code Playgroud)

在末尾.

然后,您需要使用延迟扩展替换字符.

@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
Run Code Online (Sandbox Code Playgroud)

您没有延迟扩展的情况是for在运行之前正在评估整个循环.这包括替换,因此%file_variable%将替换为循环开始之前保持的值.使用延迟扩展会延迟评估,直到执行实际行.


Rob van der Woude的网站上有各种各样出色的Windows脚本技巧,包含了很多不同的Windows操作方式和各种工具.