2015-10-06 45 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