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

If file older than X days -> run command -- CMD

我正在为各种 Windows 服务器版本的 DriveSnapshot 运行 编写脚本。 如果文件夹中有超过 6 天的文件,我想 运行 一个特定的批处理文件(完整备份)。 如果没有这样的文件 -> 运行 差异备份。

我试过了:

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

但似乎你不能 运行 ForFiles 中的任何命令。

似乎变量从未被赋予正确的值。

ForFiles 的 Microsoft 文档页面显示:

Runs the specified command on each file. Command strings should be enclosed in quotation marks.*

我知道我的命令会 set var=1 它找到的每个文件,但应该仍然有效,对吗?

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

改用 errorlevel,因为您当前的脚本会在脚本环境之外设置变量,并且它永远不会传回给父脚本。

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

forfiles command are not running in the hosting cmd instance/C 开关后面的命令行,你实际上甚至明确地创建了一个新的(通过 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"可能return 批处理文件本身的退出代码可能会无意中被 ||.

识别

如果你确实需要使用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 还会遍历目录,而不仅仅是文件。