从卷影副本备份

时间:2015-11-19 11:43:25

标签: windows batch-file backup command-prompt shadow-copy

所以,我想使用批处理脚本从影子副本进行备份。这就是我到目前为止所做的:

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

但是男人,批处理语法是一团糟,我不理解答案中的一行代码,以使其适应我的项目。

有人可以帮助我并详细解释我需要做什么(或者代码,如果你提供的话),这样我就可以理解我在做什么,而不仅仅是粘贴和复制,谁知道,做一些改进/变化。

1 个答案:

答案 0 :(得分: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%

看到区别?在第一个代码块中,mklinkfor /f循环的每次迭代时触发,并创建许多符号链接;而在第二个块中,set会在每次迭代时覆盖%target%中存储的值。 mklink在循环外运行,因此只创建一个符号链接。这就是你想要的秘诀。我想。

在cmd控制台中,输入help for以获取有关for /f循环的详细信息。