0

我正在寻找一种为服务器上的所有驱动器创建 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 命令,循环所有直到完成。

任何想法从哪里开始?

4

1 回答 1

1

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

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

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

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

于 2015-10-06T20:55:43.437 回答