2015-10-06 49 views
0

我正在寻找一种方法来为服务器上的所有驱动器创建VSS快照,以确保该功能按预期工作 - 之后,我需要删除快照 - 因此远远我一直保持简单。批处理文件:自动执行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

您可以使用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命令附加的回车符。

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


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

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

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

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

+0

嗨,感谢您的回应 - 我可以看出,这对逻辑驱动器来说很有魅力,但是我的主要问题是mounpoints - 不幸的是Logicaldisk没有提供这些信息 - 因此使用wmic volume命令。 有关如何适应这一点的任何想法? – Vanelder

+1

查看我的[编辑](http://stackoverflow.com/revisions/32979578/2):我添加了一个'wmic VOLUME'命令行,所以挂载点现在也应该包含在内;请注意,现在像'D:'这样的单个字母的驱动器现在被传递给具有尾部'\'的'vssadmin',所以'D:\',与传递'D:'的'wmic LOGICALDISK'变种相反。 .. – aschipfl

+0

完美,谢谢! – Vanelder