如何获取文件夹年龄(创建或修改日期的天数)

时间:2015-02-08 12:21:40

标签: batch-file

在特定路径下,需要找到名为“MyData”的所有文件夹。在每个“Mydata”里面需要获得每个文件夹(天)的年龄。 然后,如果年龄大于N天,我将执行一组命令。 到目前为止,我已经找到所有文件夹“MyData”及其上次修改日期,脚本为:

for /f "delims=" %%a in ('dir /b /s /a:d "C:\Mypath\" ^|findstr /e /i "\Mydata"') do (
    for /f "delims=" %%k in ('dir /b /s /a:d "%%~a\"') do (
            echo %%k
    for /d %%a in ("%%k") do echo Modified date: %%~ta
    ) 
)

从这里需要将修改日期与当前日期进行比较,以获得以天为单位的年龄。请帮助谢谢! 评论:请避免使用forfiles我的机器有WIN-XP且forfiles不存在,即使将其下载到C:\ windows \ system32后也无法正常工作。谢谢!

2 个答案:

答案 0 :(得分:3)

@npocmaka让我提出这个问题的解决方案。挑战:接受!

简单的答案是使用forfiles。运行WinXP对forfiles没有太大的障碍。 find forfiles.exe并不太难,并且在没有世界结束的情况下将其复制到System32中。 注意:forfiles的Win2K res kit版本有一些不同的语法 - 使用破折号而不是斜杠的开关,以及参数的不同间距。只需输入forfiles,不要在帮助屏幕上显示任何参数。对于子孙后代,如果指向forfiles的链接从现在起消失一年,try searching open directories

无论如何,避免使用forfilesrobocopy会使您的选择瘫痪。这是我唯一知道能够执行日期数学的两个本机命令。如果这些命令不可用,那么您必须转到Windows脚本宿主或PowerShell进行日期数学运算。这是批处理/ JScript混合示例。 (将其另存为.bat文件。)

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

@echo off
setlocal

set "age=5"
pushd "C:\MyPath"

for /d %%a in (*MyData*) do (
    for /d %%I in ("%%~a\*") do (
        call :getAge modified created accessed "%%~fI"
        setlocal enabledelayedexpansion

        echo %%~nxI was created !created! days ago.
        echo %%~nxI was modified !modified! days ago.
        echo %%~nxI was last accessed !accessed! days ago.

        if "!created!" gtr "%age%" (
            rem // do stuff to "%%~fI" if folder created > 5 days ago
        ) else if "!modified!" gtr "%age%" (
            rem // do something else to "%%~fI" if folder modified > 5 days ago
        )
        endlocal
    )
)

popd
rem // end main runtime
goto :EOF

:getAge <modified_var> <created_var> <accessed_var> <file|folder>
setlocal
for /f %%I in ('cscript /nologo /e:JScript "%~f0" "%~4"') do set "%%I"
endlocal & set "%~1=%modified%" & set "%~2=%created%" & set "%~3=%accessed%"
goto :EOF

rem // end batch portion / begin JScript
@end

var fso = new ActiveXObject("scripting.filesystemobject"),
    arg = WSH.Arguments(0),
    file = fso.FileExists(arg) ? fso.GetFile(arg) : fso.GetFolder(arg);

var props = {
    modified: new Date() - file.DateLastModified,
    created: new Date() - file.DateCreated,
    accessed: new Date() - file.DateLastAccessed
}

for (var i in props) {
    // age in days
    props[i] = Math.floor(props[i] / 1000 / 60 / 60 / 24);
    WSH.Echo(i + '=' + props[i]);
}

答案 1 :(得分:2)

Here's a jscript/bat混合,当文件应按日期/时间过滤时,可用于更常见的情况(您可以使用您想要的任何名称保存它)。 要显示5天前创建的文件夹,请使用:

FileTimeFilterJS.bat "." -dd -5 -filetime created -show dirs

显示20天前修改的目录使用:

FileTimeFilterJS.bat "." -dd -20 -filetime modified -show dirs