Batch file Windows批处理命令保留最新的30个文件夹并删除其余文件夹

Batch file Windows批处理命令保留最新的30个文件夹并删除其余文件夹,batch-file,cmd,Batch File,Cmd,我编写了一个Windows计划程序,用于备份特定位置的文件夹。文件夹名称将附加当前时间戳 echo Starting Backup of File System For /f "tokens=2-4 delims=/ " %%a in ('date /t') do ( set dt=%%c-%%a-%%b ) For /f "tokens=1-4 delims=:." %%a in ('echo %time%') do ( set tm=%%a%%b%%c%%d ) set bku

我编写了一个Windows计划程序,用于备份特定位置的文件夹。文件夹名称将附加当前时间戳

echo Starting Backup of File System
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (
    set dt=%%c-%%a-%%b
)
For /f "tokens=1-4 delims=:." %%a in ('echo %time%') do (
   set tm=%%a%%b%%c%%d
)
set bkupfoldername=UPLOADS_BACKUP_%1%dt%_%tm%

xcopy D:\Source > D:\Destination\%bkupfoldername% /Y /E /H /I

echo Backup has been completed.
我想运行另一个调度程序作业,该作业应在目标文件夹中保留最新的30个文件夹,并删除其余文件夹


我是新来的。您认为什么应该起作用?

使用
dir/o-d
按相反的时间顺序排序:

for /f "skip=30 delims=" %%d in ('dir /ad /b /o-d /tc D:\Destination\UPLOADS_BACKUP_*') do (
    rd /s /q "D:\Destination\%%d"
)

您的
DATE/T
命令的输出是什么?您的
TIME
变量解析为什么?所以基本上我想问的是,你是否将它们命名为
YYYYMMDDhhmm
。不管怎样,我们可以假设您的文件夹在事后从未被编辑过,只需使用以下命令:
FOR/F“skip=30 delims=“%%G IN('dir/AD/B/O-D uploads\u backup\”)do rd/s/q“%%~G”
此代码基本上会根据最近修改的日期跳过最新的30个文件夹,并删除其余文件夹。有关以特定格式获取日期和时间的更好解决方案,请参阅上的回答中的第2章,并阅读关于详细说明for命令行如何工作的回答。阅读我的评论上面。
SKIP=30
。在我能保证他的备份在备份后不会被编辑之前,我不会将其作为答案发布。如果有人进入并编辑目录中的一个文件,修改的时间会变新,并且根据实际文件夹名称中的日期和时间,它不会保留最新的30个文件夹。@Squashman您的评论给出了比我更好的答案。你很关心文件夹在创建后被更新的可能性,所以我刚刚在
dir
命令中添加了
/tc
选项,以使其使用创建时间。你不会使用
跳过
选项吗?@Squashman是的,跳过选项是个好主意,我不想从你那里偷,但既然你坚持,我就做;-)