Board logo

标题: [文件操作] 批处理怎么保留指定数量的文件? [打印本页]

作者: 阿一呐法    时间: 2023-5-27 09:24     标题: 批处理怎么保留指定数量的文件?

请教一下这个批处理文件怎么写
文件夹下有如下多版本的文件

    a.back           b.dat                      d.ini.5            c.txt               e.cfg               f.cfg     .....
    a.back.1        b.dat.2                   d.ini.6            c.txt.2             e.cfg.1       
    a.back.3        b.dat.5                   d.ini.15          c.txt.6
    a.back.8        b.dat.12                 d.ini.22               
    a.back.10      b.dat.42                 d.ini.41                 
    a.back.50      b.dat.95                 d.ini.58               
                        b.dat.114                               
                        b.dat.181                               

现在想通过设置指定每个文件保留指定的版本数量,
如果只保留1个最高版本,处理后剩下以下文件
    a.back.50           b.dat.181                  d.ini.58            c.txt.6              e.cfg.1          f.cfg             .....
       
如果只保留2个最高版本,处理后剩下以下文件
    a.back.10           b.dat.114                  d.ini.41            c.txt.2              e.cfg              f.cfg     .....
    a.back.50           b.dat.181                  d.ini.58            c.txt.6              e.cfg.1       

如果只保留3个最高版本,处理后剩下以下文件
    a.back.8           b.dat.95                  d.ini.22            c.txt              e.cfg              f.cfg   .....
    a.back.10         b.dat.114                d.ini.41            c.txt.2            e.cfg.1       
    a.back.50         b.dat.181                d.ini.58            c.txt.6

以此类推,处理当前目录,处理子目录的处理怎么写
作者: 77七    时间: 2023-5-27 13:21

  1. @echo off
  2. set /p n=保留数量:
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /s /a-d ^|find /v "%~0"') do (
  5. for /f "tokens=1-3 delims=." %%a in ("%%~nxi") do (
  6. set m=00000%%c
  7. if "%%c" equ "" (
  8. set "#!m:~-5!#%%~nxi.0=%%i"
  9. ) else (
  10. set "#!m:~-5!#%%~nxi=%%i"
  11. )
  12. )
  13. )
  14. for /f "tokens=1-4* delims=#=." %%a in ('set # ^|sort /r') do (
  15. if defined _"%%b.%%c" (
  16. set m=!_"%%b.%%c"!
  17. set /a m+=1
  18. set _"%%b.%%c"=!m!
  19. ) else set _"%%b.%%c"=1
  20. if !_"%%b.%%c"! gtr %n% (
  21. rem 显示正确则去掉 echo 再执行
  22. echo del "%%e"
  23. )
  24. )
  25. endlocal
  26. pause
复制代码

作者: 阿一呐法    时间: 2023-5-27 14:44

回复 2# 77七


   谢谢,测试了当前目录没得问题,但是如果是处理子目录的话,运行一次只能清除去最底层文件夹
比如,批理程序放在   文件夹A    所在目录
        文件夹A   里面有   文件夹B
        文件夹B   里面有   文件夹C
点第一次运行只会   处理        文件夹C 的文件
点第二次运行时      处理        文件夹B 的文件
点第三次运行时      处理        文件夹A 的文件
作者: 77七    时间: 2023-5-27 15:14

回复 3# 阿一呐法


   存在大量重名文件吧?是需要每个文件夹单独保留?
作者: 阿一呐法    时间: 2023-5-27 15:56

回复 4# 77七


    嗯是的,每个文件夹单独保留
作者: 77七    时间: 2023-5-27 16:13

回复 5# 阿一呐法


  
  1. @echo off
  2. set /p n=保留数量:
  3. for %%x in (.) do call :1 "%%~fx"
  4. for /r /d %%y in (*) do call :1 "%%~fy"
  5. pause
  6. exit
  7. :1
  8. pushd "%~1"
  9. echo 正在处理 "%~1"
  10. setlocal enabledelayedexpansion
  11. for /f "delims=" %%i in ('dir /b /a-d ^|find /v "%~nx0"') do (
  12. for /f "tokens=1-3 delims=." %%a in ("%%~nxi") do (
  13. set m=00000%%c
  14. if "%%c" equ "" (
  15. set "#!m:~-5!#%%~nxi.0=%%i"
  16. ) else (
  17. set "#!m:~-5!#%%~nxi=%%i"
  18. )
  19. )
  20. )
  21. for /f "tokens=1-4* delims=#=." %%a in ('set # ^|sort /r') do (
  22. if defined _"%%b.%%c" (
  23. set m=!_"%%b.%%c"!
  24. set /a m+=1
  25. set _"%%b.%%c"=!m!
  26. ) else set _"%%b.%%c"=1
  27. if !_"%%b.%%c"! gtr %n% (
  28. rem 显示正确则去掉 echo 再执行
  29. echo del "%%e"
  30. )
  31. )
  32. endlocal
  33. popd
  34. exit /b
复制代码

作者: 阿一呐法    时间: 2023-5-27 16:22

回复 6# 77七


    测试OK,太感谢了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2