需要根据文件名和日期清理日志文件

时间:2013-02-05 15:44:58

标签: windows loops batch-file

我有一个包含混合日志文件的文件夹 - 例如:

AAA.0.1.txt
AAA.0.2.txt
BBB.1.2.txt
BBB.1.3.txt
BBB.1.4.txt
CCC.0.5.txt
CCC.0.6.txt

我需要一个快速的小批处理文件来清除A,B和C中每个文件的最新(按日期)3个文件。

我可以删除文件夹中除最近3个文件以外的所有文件:

for /f "tokens=* skip=3" %%F in ('dir %myDir% /o-d /tc /b') do del %myDir%\%%F

但是我不确定如何在不对A,B和C进行硬编码并添加3个单独的循环的情况下添加命名约定(如果D显示则会被完全忽略)。

任何想法?

好的,我明白了:

@echo off
setlocal enabledelayedexpansion
cls
set fileDir=C:\My\Log\Path
set prev=A
for /f "tokens=*" %%P in ('dir %fileDir% /o-d /tc /b') do (
    set fileName=%%P
    for /f "tokens=1,2,3,4 delims=. " %%a in ("!fileName!") do set proj=%%a

    if "!proj!" == "!prev!" (
        REM skip
    ) else (
        for /f "tokens=* skip=3" %%F in ('dir %fileDir%\!proj!.* /o-d /tc /b') do del %fileDir%\%%F
        set prev=!proj!
    )
)

1 个答案:

答案 0 :(得分:0)

我相信您想要上次修改日期,因此我将选项更改为/T2。如果您真的想要创建日期,请更改回/TC

for /f "delims=." %%A in ('dir /a-d /b "%myDir%\*.*.txt"') do (
  for /f "skip=3 delims=" %%F in (
    'dir /a-d /o-d /tw /b "%myDir%\%%A.*.txt'
  ) do del "%myDir%\%%F"
)

以上可能有点效率低,因为它会尝试为每个文件删除一次旧文件。你真的只需要为每个唯一的名称前缀删除一次旧文件 - 这可以实现,但我不认为增加的复杂性是值得的。以上工作正常。