如何使用一系列变量在批处理文件中循环一组命令?

时间:2014-05-07 17:33:20

标签: windows batch-file

以下是我已经拥有的Windows批处理文件的一部分:

@echo off
setlocal ENABLEDELAYEDEXPANSION
set files=0
for /F "tokens=*" %%A in (filelist.csv) do (
    SET /A files=!files! + 1
    set var!files!=%%A
)
set var

findstr /i /c:"%var5%" trans.log
if %errorlevel% EQU 0 del %var5%

在此批处理文件中,“filelist.csv”只是自动生成的特定文件夹中的文件列表。此文件夹中文件的数量和名称每天都会更改,更改时列表会更新。 “filelist.csv”中每行有一个文件。文件中每行的内容都分配了一个名为var1到varN的变量,这些变量的值对应于实际的文件名。

批处理文件然后搜索另一个名为“trans.log”的文件。在上面的特定情况下,它搜索对应于“var5”的文件。如果它找到“trans.log”中提到的文件,那么它就会被删除。

我需要弄清楚的是这批次的最后一点:

findstr /i /c:"%var5%" trans.log
if %errorlevel% EQU 0 del %var5%

循环多次,因为变量“var1”到“varN”并且每次循环时,自动将变量替换为系列中的下一个变量。所以在上面的例子中,如果列表中有10个文件,则会有变量“var1”到“var10”。下一次循环从它上面的位置运行时,它会将“var5”替换为“var6”,然后替换为“var7”,一直到“var10”,然后它将退出循环并继续执行任何其他命令批量生产。

有人可以帮帮我吗? TIA

2 个答案:

答案 0 :(得分:0)

我认为这符合您的要求。

@ECHO OFF

@echo off
setlocal ENABLEDELAYEDEXPANSION
set files=0
for /F "tokens=*" %%A in (text.txt) do (
    SET /A files=!files! + 1
    set var!files!=%%A
    for %%i in (!files!) do (CALL :MyFunction !var%%i!)
)
REM
REM Other code can go here...
REM
GOTO END

:MyFunction
ECHO findstr /i /c:"%1" trans.log
ECHO if %errorlevel% EQU 0 del %1

:END

删除ECHO中的MyFunction语句以实际运行findstr并删除该文件。

答案 1 :(得分:0)

@echo off
setlocal
for /F "skip=4tokens=*" %%A in (filelist.csv) do (
 findstr /i /c:"%%A" trans.log > nul
 if not errorlevel 1 ECHO del %%A
)

这应该做你想要做的事情。没有样本数据,测试是不可能的。

skip=4跳过filelist.csv的前4行,并将每个后续行提供给FINDSTR,如果在{{1}中找到文件名,则将errorlevel设置为0 }。 errorlevel的trans.log测试为0 - 在前4行(跳过)后的每一行执行设置/测试循环。

请注意,if not errorlevel 1file5 时,您的原始方案会失败(如果我理解您的目的)但trans.log中的file6(或任何更晚的) - trans.log会被错误地删除并保留目标。在file5之后,您还会收到一系列针对匹配的错误,因为删除file5后,重新执行file5上的删除会发现它不存在...

当然,file5命令只是del - 在验证后将echo更改为echo del 以实际删除目标。