以下是我已经拥有的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
答案 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 1
中file5
时,您的原始方案会失败(如果我理解您的目的)但trans.log
中的file6
(或任何更晚的) - trans.log
会被错误地删除并保留目标。在file5
之后,您还会收到一系列针对匹配的错误,因为删除file5
后,重新执行file5
上的删除会发现它不存在...
当然,file5
命令只是del
- 在验证后将echo
更改为echo del
以实际删除目标。