3

そこで、バッチ スクリプトを使用してシャドウ コピーからバックアップを作成したいと考えています。それは私がこれまで持っているものです:

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 によって返された最後の行のパスのみを取得する必要がありますが、どうすればそれを達成できるかわかりません。

そして、パスを取得\して末尾に a を追加した後 (パスが a で終わる場合にのみシンボリック リンクが\作成されます)、それにシンボリック リンクを作成します。

mklink c:\shadowcopy /d %path%

だから、私はその途中で迷っています。

私は答えのあるこの質問を見つけました:

findstr の最終行を出力するバッチファイル

しかし、バッチ構文は混乱していて、私のプロジェクトに適応させるための答えのコード行を理解していません。

誰かが私を助けて、私が何をする必要があるか(またはコードを提供する場合はコード)を詳細に説明してくれるので、貼り付けてコピーするだけでなく、何をしているのかを理解し、改善/変更を加えることができます.

4

1 に答える 1

3

コマンドの出力をキャプチャしたいときはいつでも、 を使用します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\
)

このスニペットは、シャドウ リストの最後に一致した行から 1 つのリンクを作成します。

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

違いを見ます?最初のコード ブロックでは、ループmklinkの反復ごとに実行され、多数のシンボリック リンクが作成されます。for /f一方、2 番目のブロックでは、反復ごとにset格納されている値を上書きします。ループの外で実行されるため、シンボリック リンクを 1 つだけ作成します。それがあなたが探している秘密のソースだと思います。%target%mklink

ループhelp forの詳細については、コマンド コンソールで入力してください。for /f

于 2015-11-19T12:44:46.487 に答える