我在文件夹中有文件' FILEPATH',每个文件都有不同的创建日期和修改日期(修改日期小于创建日期)。 我想删除创建日期大于10天的文件。我使用下面的命令,但它适用于修改日期。
ROBOCOPY %FILEPATH% %DUMPFOLDER% /move /minage:10
del %DUMPFOLDER% /q
在某些论坛上,它写的是minage指的是创建日期,但它在执行时指的是修改日期。我在这里做错了吗?或者还有其他替代品。
答案 0 :(得分:1)
不幸的是,没有简单的方法可以做到这一点。我能够处理文件创建日期的唯一命令是dir /t:c
和wmic datafile
。可能还有其他人,但没有一个能够简化执行日期数学的过程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方法根据当前时刻测试文件年龄,而不是基于午夜;并且无需有意识的努力将处理数月,数年和闰年。