您可以使用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
的输出,您需要像上面那样通过^
转义特殊字符。
嗨,感谢您的回应 - 我可以看出,这对逻辑驱动器来说很有魅力,但是我的主要问题是mounpoints - 不幸的是Logicaldisk没有提供这些信息 - 因此使用wmic volume命令。 有关如何适应这一点的任何想法? – Vanelder
查看我的[编辑](http://stackoverflow.com/revisions/32979578/2):我添加了一个'wmic VOLUME'命令行,所以挂载点现在也应该包含在内;请注意,现在像'D:'这样的单个字母的驱动器现在被传递给具有尾部'\'的'vssadmin',所以'D:\',与传递'D:'的'wmic LOGICALDISK'变种相反。 .. – aschipfl
完美,谢谢! – Vanelder