2010-10-21 63 views
6

试图制作一个.bat脚本,并需要获得一些正常工作的字符串。Cmd:不评估循环内的变量

这是我到目前为止

@echo off 
for /r %%i in (*.csv) do (
set str=%%i 
set str=%str:csv=rar% 
echo %%i 
echo.%str% 
) 

说我有这个运行用C了:\,并得到了5 CSV,1.csv,2.csv ... 5.csv

我第一次运行它,我得到的输出:

C:\1.csv 

C:\2.csv 

C:\3.csv 

C:\4.csv 

C:\5.csv 

我第二次获得:

C:\1.csv 
csv=rar 
C:\2.csv 
csv=rar 
C:\3.csv 
csv=rar 
C:\4.csv 
csv=rar 
C:\5.csv 

然后,所有后续调用我得到:

C:\1.csv 
rar=rar 
C:\2.csv 
rar=rar 
C:\3.csv 
rar=rar 
C:\4.csv 
rar=rar 
C:\5.csv 

当什么,我会期待得到的是直通:

C:\1.csv 
C:\1.rar 
C:\2.csv 
C:\2.rar 
C:\3.csv 
C:\3.rar 
C:\4.csv 
C:\4.rar 
C:\5.csv 
C:\5.rar 

所以我删除替代:

@echo off 
for /r %%i in (*.csv) do (
echo %%i 
set str=%%i 
echo.%str% 
) 

首先运行:

C:\1.csv 

C:\2.csv 

C:\3.csv 

C:\4.csv 

C:\5.csv 

第二轮:

C:\1.csv 
C:\5.csv 
C:\2.csv 
C:\5.csv 
C:\3.csv 
C:\5.csv 
C:\4.csv 
C:\5.csv 
C:\5.csv 
C:\5.csv 

它就像它不设置str变量,直到循环的最后运行,即使它试图回声出变量,它的线设置后出现,然后保存在这个为下一个循环?在处理循环的方式中是否有某些我错过的东西?

谢谢

回答

9

您应该使用setlocal enabledelayedexpansion。实际上,在循环运行之前,%str:csv=rar%的内容仅被评估一次。所以:

@echo off 
setlocal enabledelayedexpansion 
for /r %%I in (*.csv) do (
set str=%%i 
set str=!str:csv=rar! 
echo %%i 
echo.!str! 
) 
endlocal 
+0

你先生,是个绅士! (我可以在5分钟内接受) – Psytronic 2010-10-21 12:55:33

+0

这是一个批处理文件的常见问题......几个月前,我被欺骗了...... – Benoit 2010-10-21 12:58:08