在特定路径下,需要找到名为“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后也无法正常工作。谢谢!
答案 0 :(得分:3)
@npocmaka让我提出这个问题的解决方案。挑战:接受!
简单的答案是使用forfiles
。运行WinXP对forfiles
没有太大的障碍。 find forfiles.exe并不太难,并且在没有世界结束的情况下将其复制到System32中。 注意:forfiles
的Win2K res kit版本有一些不同的语法 - 使用破折号而不是斜杠的开关,以及参数的不同间距。只需输入forfiles
,不要在帮助屏幕上显示任何参数。对于子孙后代,如果指向forfiles
的链接从现在起消失一年,try searching open directories。
无论如何,避免使用forfiles
和robocopy
会使您的选择瘫痪。这是我唯一知道能够执行日期数学的两个本机命令。如果这些命令不可用,那么您必须转到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