我正在寻找一种方法来为服务器上的所有驱动器创建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命令,循环遍历所有变量。
任何想法从哪里开始?
答案 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
解析输出,您需要像上面^
一样转义特殊字符。