批处理脚本,用于检查子目录中的现有文件是否超过一天

时间:2016-09-15 22:58:42

标签: windows batch-file

我需要检查当前目录的子目录中是否有任何文件,该文件是在前一天或之前修改过的。

如果有效,可以使用以下代码。

FOR /D /r %%G in ("*") DO forfiles /p "%%G" /D -1 /C "SET /a exists = 1"

然而,在使用它执行命令时forfiles存在一个错误,你应该从中调用另一个cmd。 (见http://ss64.com/nt/forfiles.html

最后需要调用它:

FOR /D /r %%G in ("*") DO forfiles /p "%%G" /D -1 /C "cmd /c SET /a exists = 1"

问题在于,#34;存在"将是另一个cmd会话中的局部变量而不是当前变量,所以我不会在我的脚本中使用它。

Raymond Chen建议使用另一个FOR来实际执行以下操作:https://blogs.msdn.microsoft.com/oldnewthing/20120803-00/?p=6953

这让我写了以下这一行:

for /f %%i in ('FOR /D /r %%G in ("*"^) DO forfiles /p %%G /D -1 /C "cmd /c echo 1"') do set exists=%%i

然而,在这种情况下,这并不起作用,因为我之间有另一个FOR,并且写入的内容是'存在'是子目录而不是' 1'。

我该如何解决这个问题?

提前致谢。

编辑: 正如aschipfl所提到的,切换两个FOR命令的位置使其工作,但我现在有限制,它只是检查日期而不关心时间。因此,如果脚本在2016年9月16日00:00运行,则会显示修改日期为2016年9月15日23:59的文件

1 个答案:

答案 0 :(得分:0)

为什么必须使用 FORFILES

ROBOCOPY / MINAGE 开关有帮助吗?

如果有超过1天的文件,则应设置%_exists%变量:

@ECHO OFF

(SET _fold=%USERPROFILE%\MYDIRECTORY)

SET "_exists="
FOR /F "DELIMS=" %%I IN (
    'ROBOCOPY /L /S /MINAGE:1 /NS /NC /NP /NDL /NJH /NJS "%_fold%" NULL *.*'
    ) DO SET/A _exists+=1
IF NOT DEFINED _exists EXIT/B

REM Commands here if a file exists
ECHO( Your command is running

TIMEOUT -1 >NUl
EXIT/B

显然我已经在第12行发出命令只是为了它的地狱,你可能会改变它。