我正在寻找一种删除批处理文件中全部7天以上的文件的方法。 我在网上搜索,发现了一些包含数百行代码的示例,还有一些示例须要安装额外的命令行实用程序才能完成任务。 sql
只需几行代码便可在BASH中完成相似的操做。 彷佛能够对Windows中的批处理文件至少进行一些远程操做。 我正在寻找一种能够在标准Windows命令提示符下运行且没有任何其余实用程序的解决方案。 请不要使用PowerShell或Cygwin。 编辑器
对于Windows Server 2008 R2: 函数
forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"
这将删除全部超过90天的.sql文件。 ui
Ok有点无聊,并提出了这个建议,其中包含个人一个穷人的Linux时代替代版本,该版本仅限于平常使用(无时间限制): 编码
7天清理 spa
@echo off setlocal ENABLEDELAYEDEXPANSION set day=86400 set /a year=day*365 set /a strip=day*7 set dSource=C:\temp call :epoch %date% set /a slice=epoch-strip for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do ( call :epoch %%~tf if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^) ) exit /b 0 rem Args[1]: Year-Month-Day :epoch setlocal ENABLEDELAYEDEXPANSION for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f if "!Months:~0,1!"=="0" set Months=!Months:~1,1! if "!Days:~0,1!"=="0" set Days=!Days:~1,1! set /a Days=Days*day set /a _months=0 set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1) set /a Months=!_months! set /a Years=(Years-1970)*year set /a Epoch=Years+Months+Days endlocal& set Epoch=%Epoch% exit /b 0
set /a strip=day*7
:将7更改成要保留的天数。 命令行
set dSource=C:\\temp
:这是检查文件的起始目录。 debug
这是非破坏性的代码,它将显示会发生的状况。 code
变动: token
if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
到这样的东西:
if !epoch! LEQ %slice% del /f %%f
所以实际上删除了文件
2月 :硬编码为28天。 难忘的岁月真是使人难以置信。 若是有人有想法不添加10行代码,请继续发布,以便将其添加到个人代码中。
纪元 :我没有考虑时间,由于须要删除早于某个特定日期的文件,若是花费数小时/分钟,就会从本来打算保留的日期删除文件。
纪元认为您的短日期格式是YYYY-MM-DD。 须要将其调整为其余设置或运行时评估(读取sShortTime,用户绑定配置,在过滤器中配置适当的字段顺序并使用过滤器从参数中提取正确的数据)。
我是否提到我讨厌该编辑器的自动格式化? 它删除了空白行,而且复制粘贴是一个地狱。
我但愿这有帮助。
REM del_old.bat REM usage: del_old MM-DD-YYY for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"
这将删除早于给定日期的文件。 我肯定能够将其修改成从当前日期返回7天。
更新:我注意到HerbCSO在上述脚本上有所改进。 我建议改用他的版本 。
IMO,JavaScript正在逐渐成为一种通用的脚本标准:它可能在比其余任何脚本语言都更多的产品中可用(在Windows中,可使用Windows Scripting Host得到)。 我必须清理许多文件夹中的旧文件,所以这是一个JavaScript函数:
// run from an administrator command prompt (or from task scheduler with full rights): wscript jscript.js // debug with: wscript /d /x jscript.js var fs = WScript.CreateObject("Scripting.FileSystemObject"); clearFolder('C:\\temp\\cleanup'); function clearFolder(folderPath) { // calculate date 3 days ago var dateNow = new Date(); var dateTest = new Date(); dateTest.setDate(dateNow.getDate() - 3); var folder = fs.GetFolder(folderPath); var files = folder.Files; for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() ) { var file = it.item(); if( file.DateLastModified < dateTest) { var filename = file.name; var ext = filename.split('.').pop().toLowerCase(); if (ext != 'exe' && ext != 'dll') { file.Delete(true); } } } var subfolders = new Enumerator(folder.SubFolders); for (; !subfolders.atEnd(); subfolders.moveNext()) { clearFolder(subfolders.item().Path); } }
对于每一个要清除的文件夹,只需将另外一个调用添加到clearFolder()函数便可。 此特定代码还保留exe和dll文件,并清除子文件夹。
这没什么了不得的,可是我今天须要作这样的事情并将其做为计划任务运行,等等。
批处理文件DelFilesOlderThanNDays.bat下面带有示例exec w / params:
DelFilesOlderThanNDays.bat 7 C:\\ dir1 \\ dir2 \\ dir3 \\ logs * .log
echo off cls Echo( SET keepDD=%1 SET logPath=%2 :: example C:\dir1\dir2\dir3\logs SET logFileExt=%3 SET check=0 IF [%3] EQU [] SET logFileExt=*.log & echo: file extention not specified (default set to "*.log") IF [%2] EQU [] echo: file directory no specified (a required parameter), exiting! & EXIT /B IF [%1] EQU [] echo: number of days not specified? :) echo( echo: in path [ %logPath% ] echo: finding all files like [ %logFileExt% ] echo: older than [ %keepDD% ] days echo( :: :: :: LOG echo: >> c:\trimLogFiles\logBat\log.txt echo: executed on %DATE% %TIME% >> c:\trimLogFiles\logBat\log.txt echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt echo: in path [ %logPath% ] >> c:\trimLogFiles\logBat\log.txt echo: finding all files like [ %logFileExt% ] >> c:\trimLogFiles\logBat\log.txt echo: older than [ %keepDD% ] days >> c:\trimLogFiles\logBat\log.txt echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt :: FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path" >> c:\trimLogFiles\logBat\log.txt 2<&1 IF %ERRORLEVEL% EQU 0 ( FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c echo @path" ) :: :: :: LOG IF %ERRORLEVEL% EQU 0 ( echo: >> c:\trimLogFiles\logBat\log.txt echo: deleting files ... >> c:\trimLogFiles\logBat\log.txt echo: >> c:\trimLogFiles\logBat\log.txt SET check=1 ) :: :: IF %check% EQU 1 ( FORFILES /p %logPath% /s /m %logFileExt% /d -%keepDD% /c "cmd /c del @path" ) :: :: RETURN & LOG :: IF %ERRORLEVEL% EQU 0 echo: deletion successfull! & echo: deletion successfull! >> c:\trimLogFiles\logBat\log.txt echo: ---------------------------------------------------------- >> c:\trimLogFiles\logBat\log.txt