批处理文件删除除最新的10个文件夹以外的所有文件夹

时间:2017-05-18 20:16:07

标签: batch-file cmd

我有一个包含我们日志文件的文件夹。我们有许多进程可以在其中创建日志文件的名称。示例如下。我想保留每个进程的最后10个日志文件(日志文件名)并删除任何其他文件。我看过一些与此相近的帖子(batch file remove all but the newest 10 files),但是除了最后10个文件外,它们都删除了。我需要最后10个不同的命名文件。

  items  x   mu   y
1     a -6 -3.0 NaN
2     b  8  6.5 6.5
3     a  0 -3.0 NaN
4     a -3 -3.0 NaN
5     b  5  6.5 6.5

我对此完全陌生,并提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

虽然您没有表现出任何自己的努力,但我决定提供一个满足您要求的脚本,因为我发现它具有挑战性;所以这是:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

rem // Define constants here:
set "_LOCATION=."
set "_PATTERN=*_??????????????"
set "_EXTENSION=.log"
set /A "_KEEP=2"

rem // Retrieve unique file name prefixes (with date/time stamp truncated):
if defined _EXTENSION (set "EXT=!_EXTENSION!") else set "EXT=."
for /F "delims= eol=|" %%F in ('dir /B /O:-N "!_LOCATION!\!_PATTERN!!EXT!"') do (
    set "FILE=%%F" & set "NAME=_" & set "ITEM="
    for %%N in ("!FILE:_=" "!") do (
        set "NAME=!NAME!!ITEM!_" & set "ITEM=%%~N"
    )
    set "NAME=!NAME:~2!"
    if defined NAME set "$UNIQUE[!NAME!]=#"
)
rem // Delete all but last number of files per unique file name prefix:
if %_KEEP% GTR 0 (set "SKIP=skip=%_KEEP%") else set "SKIP="
for /F "tokens=2 delims=[=] eol==" %%L in ('2^> nul set $UNIQUE[') do (
    for /F "%SKIP% delims= eol=|" %%E in ('dir /B /O:-N "!_LOCATION!\%%L*!EXT!"') do (
        ECHO erase "%%E"
    )
)

endlocal
exit /B

在确认要删除正确的文件后,删除ECHO命令行前面的大写erase命令

我假设日志文件的文件扩展名为.log。该脚本可以处理文件名中包含任意数量下划线_的文件。但是,如果任何文件名包含以下任何字符,它可能会失败:!^=[]。< / p>