文件保留脚本

时间:2014-08-28 22:24:11

标签: batch-file

我有一个包含10个子目录的目录。其中每个都包含不同的.bak文件。我试图创建一个脚本来检查是否有X个文件,如果文件数超过X,它会删除最旧的文件。换句话说,我想要.bak文件的20次迭代。当第21个出现时,我希望批处理文件删除最旧的批处理文件。 这可能吗? 如果是这样,我可以创建一个查看所有子目录的单个脚本吗? 提前谢谢。

3 个答案:

答案 0 :(得分:1)

包括两个选项。第一个文件将在每个文件夹下留下%maxFiles% bak个文件。第二个(Windows Vista或更高版本操作系统是必需的,因为robocopy用于获取已排序的文件列表)将总共%maxFiles%

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "rootFolder=%cd%"
    set "maxFiles=20"

    rem Option 1 - Keep %maxFiles% inside each of the subfolders
    for /d /r "%rootFolder%" %%z in (*) do for /f "skip=%maxFiles% delims=" %%a in (
        'dir /tc /o-d /a-d /b "%%~fz\*.bak" 2^>nul'
    ) do echo del "%%~fz\%%~nxa"

    echo ------------------------------

    rem Option 2 - Keep %maxFiles% in total under all the subfolders
    for /f "skip=%maxFiles% tokens=2,*" %%a in ('
        robocopy "%rootFolder%" "%rootFolder%" *.bak /l /nocopy /is /s /njh /njs /ndl /nc /ns /ts
        ^| findstr /v /r /e /i /c:"%rootFolder:\=\\%\\[^\\]*" 
        ^| sort /r
    ') do echo del "%%b"

del命令仅回显给控制台。如果输出正确,请删除echo命令以删除文件

答案 1 :(得分:0)

假设您要检查父目录中的文件数。也可以为每个子目录完成。

@echo off
setlocal

set "max_number_files=20"
set "parrent_dir=c:\whatever_you_need"
set "extension=.bak"

pushd "%parrent_dir%"
set "count=0"

setlocal enableDelayedExpansion
for /f "delims=" %%a in ('dir /s /b /a:-d /o:-d /t:c *%extension%') do (
    set /a count=count+1
    if 1!count! GTR 1!max_number_files! (
        rem  --- remove the echo to activate deletion 
        echo del /q /f "%%~a"
    )
)
popd
endlocal
endlocal

答案 2 :(得分:0)

这将检查d:\base\folder下的每个文件夹,如果有超过20个*.bak文件,则会删除最旧的文件,因此每个文件夹中只保留20 * .bak文件。

在一些示例文件夹上测试它。

@echo off
for /d /r "d:\base\folder" %%a in (*) do (
   pushd "%%a"
      for /f "skip=20 delims=" %%b in ('dir /b /a-d /o:-d *.bak ') do del "%%b"
   popd
)