Cmd:不评估循环内的变量

时间:2010-10-21 12:45:58

标签: batch-file cmd

尝试制作.bat脚本,并且需要让一些字符串正常工作。

这是我到目前为止所得到的

@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变量,即使它试图回显变量,其中的行在设置之后发生,然后将其保存到下一个循环中?在处理循环的过程中,我是否缺少某些东西?

由于

1 个答案:

答案 0 :(得分:10)

您应该使用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