批量循环文件夹名称按日期排序,忽略较新的N个元素

时间:2016-02-11 12:19:39

标签: windows batch-file

因此,我必须在Windows(.bat)中批量删除备份磁盘中的旧文件夹。

我已经创建了一个脚本来单独删除文件夹:

delete_single_folder.bat

@echo off
if %1.==. goto usage
if exist %1\nul goto deldir
echo Folder %1 does not exists.
goto end
::------------------------------------------------
:deldir
rd /s/q %1
echo Folder %1 deleted.
goto :end
::------------------------------------------------
:usage
echo usage:
echo   %0 DIRNAME
echo.
echo Deletes the directory named DIRNAME and everything in it if it exists!
echo.
:end

正如您在::usage中看到的,它是通过delete_single_folder FOLDER_TO_DELETE执行的。大。

现在,我按日期降序排列所有文件夹:

dir /ad /b /O-D

使用for循环删除所选文件夹:

for /f %%i in ('dir /ad /b /O-D') do ( 
     delete_single_folder %%i
)

效果很好,问题是删除所有文件夹,我想忽略N条记录(天)。

  • 有一种方法可以使用dir命令忽略最后N个文件夹,只将旧文件夹传递给for循环吗?

dir /ad /b /O-D的实际输出

20160211
20160210
20160209
20160208
20160207
20160206
20160205
20160204
20160203
20160202
20160201
20160131

但我想要的是:dir /ad /b /O-D /ignore_first_5

预期输出

20160206
20160205
20160204
20160203
20160202
20160201
20160131

1 个答案:

答案 0 :(得分:2)

我们可以通过在命令中使用 skip 选项来实现这一点。

语法:

for /f "tokens=* skip=4" %a in ('dir /ad /b /O-D') do echo %a

上面的命令会跳过输出中的前四个文件夹。

你可以根据你的要求调整命令

对您的代码进行的更改以使其正常工作:

for /f "tokens=* skip=5" %%i in ('dir /ad /b /O-D') do ( 
 echo %%i

使用RD替换echo %% i以删除文件夹,一旦您认为它按预期工作