robocopy 命令根据创建日期移动文件

robocopy command to move file based on created date

我在文件夹'FILEPATH'中有文件,每个文件都有不同的创建日期和修改日期(修改日期小于创建日期)。 我想删除创建日期大于 10 天的文件。我使用了以下命令,但它在修改日期有效。

ROBOCOPY %FILEPATH% %DUMPFOLDER% /move /minage:10

del %DUMPFOLDER% /q

在某些论坛上,它写道 minage 指的是创建日期,但它指的是执行时的修改日期。我在这里做错了什么吗?或者有没有其他替代品。

不幸的是,没有简单的方法可以做到这一点。据我所知,可以处理文件 创建 日期的唯一命令是 dir /t:cwmic datafile。可能还有其他的,但是 none 可以像 forfilesrobocopy 那样简化执行日期数学运算。

由于批处理中的日期数学无论如何都很麻烦,在这种情况下,从另一个运行时环境中借用是有意义的——例如 PowerShell,或者 VBScript 或 JScript。 Windows 脚本宿主 FileSystemObject's File Object 具有 DateCreatedDateLastAccessedDateModified 的属性。使用 JScript,根据 DateCreated 属性 获取文件的年龄只是 JavaScript Date() 算法的问题。

给这个 .bat 脚本加盐调味:

@if (@CodeSection == @Batch) @then

@echo off
setlocal

set "FILEPATH=c:\path\to\whatever"
set "age=10"

for %%I in ("%FILEPATH%\*") do (
    call :getAge result "%%~fI"
    setlocal enabledelayedexpansion
    if !result! gtr %age% (
        echo %%~nxI created !result! days ago and should be deleted
        rem del "%%~fI"
    ) else (
        echo %%~nxI is new ^(created !result! days ago^)
    )
    endlocal
)

goto :EOF

:getAge <return_var> <filename>
for /f "delims=" %%I in ('cscript /nologo /e:Jscript "%~f0" "%~2"') do set "%~1=%%I"
goto :EOF

@end

// JScript portion

var fso = WSH.CreateObject('scripting.filesystemobject'),
    created = fso.GetFile(WSH.Arguments(0)).DateCreated,
    age = new Date() - created;

WSH.Echo(Math.floor(age / 1000 / 60 / 60 / 24));

如果你想要更简单的东西,你可以使用 wmic datafile 并获得 get creationdate like this cat does 的前 8 位数字,但他的解决方案没有考虑一天中的时间。这种方法可能会不适当地删除 9 天 23 小时前的文件。然后还有计算新月份天数的问题。上面的 JScript 方法基于当前时刻而不是基于午夜来测试文件年龄;并且会不自觉地处理跨月、跨年和跨年的问题。