如果文件早于X天->运行命令-CMD

时间:2019-10-25 08:18:57

标签: batch-file cmd forfiles

我正在为在各种Windows Server版本上运行的DriveSnapshot编写脚本。 如果文件夹中的文件早于6天,我想运行特定的批处理文件(fullbackup)。 如果没有这样的文件->运行差异备份。

我尝试过:

ForFiles /p "path\to\folder" /d -6 /c "cmd /c set var=1"
if %var% == 1 (
   fullbackup.bat
) else (
   diffbackup.bat
)

但是看来您不能只在ForFiles中运行任何命令。

似乎从未为变量分配适当的值。

ForFiles的Microsoft文档页面显示为:

  

在每个文件上运行指定的命令。命令字符串应用引号引起来。*

我知道我的命令会为找到的每个文件set var=1,但仍然应该起作用,对吧?

如果有解决此问题的更好方法,请赐教...

2 个答案:

答案 0 :(得分:0)

使用errorlevel代替,因为当前脚本在脚本环境之外设置了变量,并且永远不会将其传递回父脚本。

ForFiles /p "z:\work" /d -100 /c "cmd /c">nul 2>&1
if errorlevel 1 call diffbackup.bat else call fullbackup.bat

答案 1 :(得分:0)

forfiles command/C开关后面的命令行未在主机cmd instance中运行,实际上,您甚至在显式地创建一个新的(通过cmd /C

但是有一种更简单的方法,将forfiles的退出代码与conditional execution operators && and ||一起使用:

forfiles /P "D:\path\to\folder" /D -6 > nul 2>&1 && (
    "D:\path\to\fullbackup.bat"
) || (
    "D:\path\to\diffbackup.bat"
)

通常,我建议使用call来运行批处理文件中的另一个批处理文件,但是在这种情况下,我故意跳过了它,因为call "fullbackup.bat"可能会在其文件中返回该批处理文件的退出代码。可能会被||意外识别的所有者。

如果在下面还有其他命令时确实需要使用call,我会使用它:

forfiles /P "D:\path\to\folder" /D -6 > nul 2>&1 && (
    call "D:\path\to\fullbackup.bat" & goto :NEXT
) || (
    call "D:\path\to\diffbackup.bat"
)
:NEXT

请注意,forfiles还会遍历目录,而不仅仅是文件。