2015-11-19 36 views
2

因此,我想使用批處理腳本從影子副本進行備份。這是我到目前爲止有:從影子副本備份

vssadmin list shadows | findstr /C:"Volume da Cópia de Sombra" 

輸出:

 Volume da Cópia de Sombra: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1 
    Volume da Cópia de Sombra: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2 
    Volume da Cópia de Sombra: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy5 

我需要得到只有在FINDSTR返回的最後一行的路徑,但我真的不知道我怎麼會完成它。

和獲取路徑並添加\到結束(只會使符號鏈接,如果路徑以\結束)做一個符號鏈接到它後。

mklink c:\shadowcopy /d %path% 

所以,我迷失在它的中間。

我發現一個回答這個問題:

Batch file to output last line of findstr

但人,批量語法是一個爛攤子,我不明白的代碼行的答案來適應我的項目。

有人可以幫助我並詳細解釋我需要做什麼(或者代碼,如果你提供的話),這樣我就可以理解我在做什麼,而不是僅僅粘貼和複製,誰知道做一些改進/變化。

回答

2

無論何時想要捕獲命令的輸出,請使用for /f。我建議?在這種情況下是一個方便的分隔符。

此代碼段將創建所有影子副本的鏈接。

if not exist c:\shadowcopy md c:\shadowcopy 
for /f "tokens=2 delims=?" %%I in ('vssadmin list shadows ^| find "GLOBALROOT"') do (
    mklink /d c:\shadowcopy\%%~nxI \\?%%I\ 
) 

這個片段將創建影子列表的最後匹配行單一鏈路。

for /f "tokens=2 delims=?" %%I in ('vssadmin list shadows ^| find "GLOBALROOT"') do (
    set "target=\\?%%I\" 
) 
mklink /d c:\shadowcopy %target% 

看到區別?在第一個代碼塊中,mklink會在for /f循環的每次迭代中觸發並創建許多符號鏈接;而在第二個塊中,set將在每次迭代時覆蓋存儲在%target%中的值。 mklink運行外部循環,因此只創建一個符號鏈接。這是你正在尋找的祕訣,我想。

在cmd控制檯中,輸入help for以獲取有關for /f環路的更多信息。

+0

爲什麼管道前面的「^」? – Rafael

+1

由於管道未用雙引號引起,因此會被過早視爲文字命令分隔符。嘗試一下,看看會發生什麼。如果沒有,cmd解釋器會將管道視爲'for'命令的結尾,而不是我們想要的'vssadmin'命令的結尾。用插入符號轉移管道會延遲對管道的評估,直到執行'vssadmin'命令。 – rojo

+0

嗯,我明白了。所以,'^'是批量轉義字符?有道理,因爲'\\''是批量使用的。非常感謝。編輯:必須編輯becase'\\'是一個轉義字符在這裏,所以需要添加雙xD – Rafael

相關問題