批处理文件:自动执行 VSS 快照检查

Batch file: Automate VSS Snapshot checks

我正在寻找一种方法来为服务器上的所有驱动器创建 VSS 快照,以确保该功能按预期工作 - 之后我需要删除快照 - 到目前为止我已经保持简单。

 vssadmin create shadow /for=C: >> C:\temp\vssoutput.txt
 vssadmin create shadow /for=E: >> C:\temp\vssoutput.txt

 vssadmin delete shadows /for=C:
 vssadmin delete shadows /for=E:

随着时间的流逝,我开始遇到带有 F:\、G:\ 甚至 SQL 挂载点的服务器 - 所以我希望进一步自动化此脚本。

理想情况下,我想 运行 检查驱动器 (wmic Volume get Capacity, Name),然后将它们设置为变量,然后 运行 基于该变量的 vssadmin 命令循环全部完成。

有什么想法可以从哪里开始?

您可以使用 for /F 来解析命令的输出,例如 wmic 命令行。

首先,我们需要assemble一个合适的wmic命令:

wmic LOGICALDISK WHERE (DriveType=3 AND Size^>0) GET Name /VALUE

让我们使用 LOGICALDISK 而不是 VOLUME,因为后者 return 也是没有盘符和系统保留分区的项目。
过滤器 DriveType=3 仅包括本地磁盘驱动器;过滤器 Size>0 排除非格式化项(> 必须像命令行中的 ^> 一样转义,因为 > 有特殊含义——重定向)。
/VALUE 开关告诉 wmic 到 return 行,例如 Name=C:.

然后,我们绕过正确的 for /F 命令(另请参阅 for /? 以获得帮助):

for /F "tokens=2 delims==" %%V in ('
    wmic LOGICALDISK WHERE ^(DriveType^=3 AND Size^^^>0^) ^
        GET Name /VALUE
') do for /F "delims=" %%L in ("%%V") do (
    echo.%%L
    rem Here you may add your `vssadmin` command lines:
    vssadmin create shadow /for=%%L >> C:\temp\vssoutput.txt
    ::
    vssadmin delete shadows /for=%%L
)

实际上有两个嵌套的 for /F 循环:外部循环解析 wmic 命令行的输出并枚举所有找到的驱动器;内部的每个驱动器只迭代一次,旨在删除可能由 wmic 命令附加的 carriage-return 字符。

要在for /F中使用上面构建的wmic命令行,需要对几个特殊字符进行转义;这解释了额外的 ^ 符号。


要在 wmic 命令的输出中也包括挂载点,您可以使用以下命令行:

wmic VOLUME WHERE (DriveType=3 AND FileSystem^>"" AND SystemVolume=FALSE) GET Name

过滤器 DriveType=3 仅包括本地磁盘驱动器;过滤器 FileSystem>"" 排除未格式化的项目;过滤器 SystemVolume=FALSE 排除了系统保留的分区。

要使用 for /F 解析输出,您需要像上面那样通过 ^ 转义特殊字符。