【问题标题】:Backup from shadow copy从卷影副本备份
【发布时间】:2016-02-21 13:00:11
【问题描述】:

所以,我想使用批处理脚本从卷影副本中进行备份。这就是我目前所拥有的:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    当您想要捕获命令的输出时,请使用for /f。我建议 ? 在这种情况下是一个方便的分隔符。

    这个 sn-p 将为所有卷影副本创建链接。

    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\
    )
    

    这个 sn-p 将从影子列表的最后匹配行创建一个链接。

    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 循环的更多信息。

    【讨论】:

    • 为什么^ 在管道前面?
    • 因为管道没有用双引号引起来,并且会过早地被视为文字命令分隔符。不试一试,看看会发生什么。如果没有,cmd 解释器将管道视为for 命令的结尾,而不是我们想要的vssadmin 命令的结尾。使用插入符号转义管道会延迟管道的评估,直到运行 vssadmin 命令。
    • 嗯,我明白了。那么,^ 是批量转义字符吗?有道理,因为\` 被广泛地批量使用。非常感谢伙计。编辑:必须编辑因为`\`是这里的转义字符,所以需要添加双xD
    • @Rafael,FINDSTR 命令在正则表达式中使用 \ 进行转义。如果您需要转义百分比符号,则将百分比符号加倍。只是批处理的几个特点。
    • 简直完美
    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2012-10-09
    相关资源
    最近更新 更多