我正在为在各种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
,但仍然应该起作用,对吧?
如果有解决此问题的更好方法,请赐教...
答案 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
还会遍历目录,而不仅仅是文件。