0

我正在为在各种 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.

似乎该变量永远不会被赋予正确的值。

Microsoft Docs 页面ForFiles内容如下:

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

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

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

4

2 回答 2

0

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

ForFiles /p "z:\work" /d -100 /c "cmd /c">nul 2>&1
if errorlevel 1 call diffbackup.bat else call fullbackup.bat
于 2019-10-25T08:37:27.060 回答
0

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

但是有一种更简单的方法,将 的退出代码forfiles条件执行运算符&&||一起使用:

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还会迭代目录,而不仅仅是文件。

于 2019-10-25T08:59:55.880 回答