【问题标题】:If file older than X days -> run command -- CMD如果文件早于 X 天 -> 运行命令 - CMD
【发布时间】:2020-02-21 14:01:34
【问题描述】:

我正在为在各种 Windows Server 版本上运行的 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 Docs 页面内容如下:

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

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

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

【问题讨论】:

    标签: batch-file cmd forfiles


    【解决方案1】:

    forfiles command/C 开关后面的命令行没有在主机cmd instance 中运行,您实际上甚至明确地创建了一个新的命令行(cmd /C)。

    但还有一种更简单的方法,将退出代码forfilesconditional 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 还会迭代目录,而不仅仅是文件。

    【讨论】:

    • 谢谢!这如我所愿。最后一行:文件夹 ATM 中要么只有一个文件,要么什么都没有,所以它现在可以工作。如果涉及到它,我只会对每个子文件夹运行多项检查。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!这也有效。也感谢您格式化我的问题;)
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多