基于创建日期而非修改日期,编写批处理脚本以删除早于X天的文件。

4

在Windows机器上(Win 7或Win Server 2008 R2),我有一个批处理脚本,将一些.config文件复制到备份文件夹中。
我想再写一个脚本,删除一周前创建的备份文件。

有很多建议可以使用FORFILES(例如):

FORFILES /P "D:\Configs_Backup" /M *.config /D -7 /C "cmd /c del @file"

但是该命令使用了“修改”时间戳,而我需要使用创建日期。

不安装任何第三方程序,是否可以通过命令控制台实现此操作?


你可以使用 DIR /TC,但可能需要进行日期解析。 - LS_ᴅᴇᴠ
1
这可能不是最好的方法,但你可以强制原始脚本创建新文件,以便“修改日期”是新的。我个人只是讨厌使用批处理文件进行任何字符串解析。 - Gray
@Gray:是的,也许不是最优的,但在我的情况下,你的想法实际上并不差。对于这个提示点赞。 - Francesco
3个回答

5

尝试这个,查看输出并移除echo,如果它看起来不错:

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
SET /a XDay=7
CALL :DateToJDN "%DATE%" JDNToday
FOR /r "D:\Configs_Backup" %%a IN (*.config) DO (
    FOR /f "tokens=1,4*" %%b IN ('dir /tc "%%~a"^|findstr "^[0-9]"') DO (
        CALL :DateToJDN "%%b" filedate
        SET /a diffdays=JDNToday-filedate
        IF !diffdays! gtr %XDay% ECHO DEL /F /Q "%%~a"
        )
    )
GOTO :eof

:DateToJDN "DD mm/dd/yyyy" jdn=
setlocal
set date=%~1
set /A yy=%date:~-4%, mm=1%date:~-10,2% %% 100, dd=1%date:~-7,2% %% 100
set /A a=mm-14, jdn=(1461*(yy+4800+a/12))/4+(367*(mm-2-12*(a/12)))/12-(3*((yy+4900+a/12)/100))/4+dd-32075
endlocal & set %2=%jdn%
exit /B

注意:这仅适用于 AM/PM 时间格式。

我进行了一些测试,它运行良好。我的本地时间格式为24小时制(欧洲时间),而不是AM / PM格式。但是,通过提供旧文件和新文件,批处理能够仅选择7天前的旧文件。您指的是其他事情吗? - Francesco
请将时间格式更改为“tokens=1,3”,而不是“tokens=1,4”。这在此处有效。 - Endoro
如果您修改了此处的 IF !diffdays! gtr %XDay%,批处理文件还可以选择许多其他时间和范围,请在命令行中查看 if /? - Endoro

1
看看这是否有帮助 - 保留最近创建日期的5个*.config文件(跳过前5个)
在示例文件上进行测试。
@echo off
pushd "d:\folder"
   del file2.tmp 2>nul
   for /f "delims=" %%a in ('dir *.config /b /a-d ') do call :getcreationdate "%%~fa"
   sort /r <file2.tmp >file.tmp
   for /f "skip=5 tokens=1,*" %%a in (file.tmp) do del "%%~b"
   del file.tmp file2.tmp 
popd
pause
goto :EOF

 :getcreationdate
 set "file=%~1"
 set "file=%file:\=\\%"
 WMIC DATAFILE WHERE name="%file%" get creationdate | find "." >file.tmp
 for /f %%b in (file.tmp) do set dt=%%b
 set dt=%dt:~0,8%_%dt:~8,6%
 del file.tmp
 >>file2.tmp echo %dt% "%~1"

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接