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

时间:2015-01-28 16:09:49

标签: batch-file robocopy

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

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

del %DUMPFOLDER% /q

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

1 个答案:

答案 0 :(得分:1)

不幸的是,没有简单的方法可以做到这一点。我能够处理文件创建日期的唯一命令是dir /t:cwmic datafile。可能还有其他人,但没有一个能够简化执行日期数学的过程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方法根据当前时刻测试文件年龄,而不是基于午夜;并且无需有意识的努力将处理数月,数年和闰年。