@echo OFF
SETLOCAL
SET "skip="
SET "targetdate=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%"
SET /a targetdate=20130624
:: Adjust back 1 month then compensate for was-January
SET /a targetdate-=100
IF %targetdate:~-4,2%==00 SET /a targetdate-=8800
FOR /f "tokens=1,2delims=: " %%i IN (
'findstr /n /i "process complete" yourlogfile.txt') DO (
IF "%%j" lss "%targetdate%" SET skip=skip=%%i
IF "%%j" geq "%targetdate%" GOTO trunc
)
:trunc
(
FOR /f "tokens=1*%skip%delims=:" %%i IN ('findstr /n "$" yourlogfile.txt') DO ECHO(%%j
)>newlogfile.txt
ECHO MOVE /y newlogfile.txt yourlogfile.txt
GOTO :eof
在没有更多信息的情况下,我假设您的日志文件中唯一包含字符串“process complete”的行是您提到的那些;您还需要保留空行,最重要的是我们可以采用“30 天”的橡胶定义。
由于我的日期格式与您的不同,我只是用20130624
. 您需要删除该行。
从格式为 yyyymmdd 的当前日期减去 100,即为上个月的同一天。如果结果月份是00
当前月份是一月,那么再减去 8800 (=100000 - 1200)
接下来,查找包含“进程完成”字符串的最后一个日志行号,该字符串的日期比一个月前的日期少,并构建一个skip
子句以跳过该行号(将被删除,因为这些都是一个多月大)
然后将计算的 SKIP 应用到 afindstr /n
以构建一个新文件 - 减去不需要的数据。
我将 MOVE 保留为 an ECHO
,以便使用之前和之后的版本。检查后,删除ECHO
以用新日志文件替换旧日志文件。
如果您希望计算正好是 30 天,那么只需在目标日期上稍作调整即可。