robocopy 命令根据创建日期移动文件
robocopy command to move file based on created date
我在文件夹'FILEPATH'中有文件,每个文件都有不同的创建日期和修改日期(修改日期小于创建日期)。
我想删除创建日期大于 10 天的文件。我使用了以下命令,但它在修改日期有效。
ROBOCOPY %FILEPATH% %DUMPFOLDER% /move /minage:10
del %DUMPFOLDER% /q
在某些论坛上,它写道 minage 指的是创建日期,但它指的是执行时的修改日期。我在这里做错了什么吗?或者有没有其他替代品。
不幸的是,没有简单的方法可以做到这一点。据我所知,可以处理文件 创建 日期的唯一命令是 dir /t:c
和 wmic datafile
。可能还有其他的,但是 none 可以像 forfiles
或 robocopy
那样简化执行日期数学运算。
由于批处理中的日期数学无论如何都很麻烦,在这种情况下,从另一个运行时环境中借用是有意义的——例如 PowerShell,或者 VBScript 或 JScript。 Windows 脚本宿主 FileSystemObject
's File
Object 具有 DateCreated
、DateLastAccessed
和 DateModified
的属性。使用 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 方法基于当前时刻而不是基于午夜来测试文件年龄;并且会不自觉地处理跨月、跨年和跨年的问题。
我在文件夹'FILEPATH'中有文件,每个文件都有不同的创建日期和修改日期(修改日期小于创建日期)。 我想删除创建日期大于 10 天的文件。我使用了以下命令,但它在修改日期有效。
ROBOCOPY %FILEPATH% %DUMPFOLDER% /move /minage:10
del %DUMPFOLDER% /q
在某些论坛上,它写道 minage 指的是创建日期,但它指的是执行时的修改日期。我在这里做错了什么吗?或者有没有其他替代品。
不幸的是,没有简单的方法可以做到这一点。据我所知,可以处理文件 创建 日期的唯一命令是 dir /t:c
和 wmic datafile
。可能还有其他的,但是 none 可以像 forfiles
或 robocopy
那样简化执行日期数学运算。
由于批处理中的日期数学无论如何都很麻烦,在这种情况下,从另一个运行时环境中借用是有意义的——例如 PowerShell,或者 VBScript 或 JScript。 Windows 脚本宿主 FileSystemObject
's File
Object 具有 DateCreated
、DateLastAccessed
和 DateModified
的属性。使用 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 方法基于当前时刻而不是基于午夜来测试文件年龄;并且会不自觉地处理跨月、跨年和跨年的问题。