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

时间:2015-10-06 16:33:30

标签: batch-file command volume-shadow-service

我正在寻找一种方法来为服务器上的所有驱动器创建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命令,循环遍历所有变量。

任何想法从哪里开始?

1 个答案:

答案 0 :(得分:1)

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

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

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

让我们使用LOGICALDISK而不是VOLUME,因为后者也会返回没有驱动器号和系统保留分区的项目。
过滤器DriveType=3仅包含本地磁盘驱动器;过滤器Size>0排除了非格式化的项目(>必须在命令行中像^>一样进行转义,因为>具有特殊含义 - 重定向。“ /> /VALUE开关告诉wmic返回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命令追加的回车符。

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

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

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

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

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