批处理文件:自动执行 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
解析输出,您需要像上面那样通过 ^
转义特殊字符。
我正在寻找一种方法来为服务器上的所有驱动器创建 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
解析输出,您需要像上面那样通过 ^
转义特殊字符。