我的工作目录中有 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
感谢。
答案 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的答案中描述的方法相比,这种方法不够灵活,可能性能较差。它可能只是一种延迟变量扩展的快速而肮脏的方法,而无需为其启用特殊语法。