web-dev-qa-db-ja.com

ワイルドカードとサブパスを含むRobocopy / xd

私はこの正確な質問が以前に尋ねられたとは思わない(私は見た)。

私のバックアップサーバーはRobocopyを使用してスクリプトを実行しており、本当にバックアップする必要のないファイル、特に次のファイルを除外したいと思います。

*\AppData\Local\Google 
*\AppData\Local\Microsoft\Windows 
*\AppData\Local\NVIDIA 
*\AppData\Local\Temp 
*\AppData\LocalLow\Google

(これらはすべて、解析に長い時間がかかりますが、復元には必要ない100万の小さなキャッシュファイルを持っています。増分バックアップランタイムのほとんどはこれらを処理しています)

「\ AppData ...」の前のパスは、マシン名、ユーザー名(マシンごとに複数のユーザー)、およびその特定のマシンのフォルダー構造(すべてのユーザーがc:にすべてのデータを持っているわけではありません)によって異なります。

簡単にするために、Robocoyの各呼び出しで使用する_excludeという環境変数があります。

SET _exclude= /XD *AppData\Local\Google *AppData\Local\Temp [...etc]

重要なデータが除外されるため、「AppData」、「Local」、「Google」を含むeveryディレクトリを除外したくありません。特定のサブパスのみ。

パスを囲む二重引用符の有無にかかわらず、「\」の有無にかかわらず、「*」の有無にかかわらず、それらの順列を試してみました。

すべてのマシンのすべてのユーザーの特定のパスをハードコーディングせずに、Robocopyでこれを機能させる方法はありますか?any

3
nerdfever.com

Robocopyは、あなたが探していることをそれ自体では絶対に行いません。

最初は、除外リストを動的に生成するスクリプトを作成するように指示することを考えましたが、コマンドラインの長さの制限に遭遇する可能性があります。

そのことを念頭に置いて、Robocopyの「ジョブ」ファイルを作成するスクリプトを作成するのが最善だと思います。 C:\Usersの内容に基づいて動的に単純なジョブを作成するスクリプトを次に示します。

@echo off
set DEST=\\SERVER\SHARE
set SRC=C:\Users
set RCJ=%RANDOM%.RCJ

echo /DD:%DEST%>%RCJ%
echo /SD:%SRC%>>%RCJ%
echo /IF>>%RCJ%
echo *>>%RCJ%
echo /S     :: copy Subdirectories, but not empty ones.>>%RCJ%
echo /E     :: copy subdirectories, including Empty ones.>>%RCJ%
echo /COPY:DAT  :: what to COPY for files (default is /COPY:DAT).>>%RCJ%
echo /PURGE     :: delete dest files/dirs that no longer exist in source.>>%RCJ%
echo /MIR       :: MIRror a directory tree (equivalent to /E plus /PURGE).>>%RCJ%
echo /R:1000000 :: number of Retries on failed copies: default 1 million.>>%RCJ%
echo /W:30      :: Wait time between retries: default is 30 seconds.>>%RCJ%
echo /XD        :: eXclude Directories matching these names>>%RCJ%

for /d %%i in (%SRC%\*) do call :_de "%%i">>%RCJ%

robocopy /job:%RCJ%
del %RCJ%
goto :EOF

:_de
echo %~1\AppData\Local\Google
echo %~1\AppData\Local\Microsoft\Windows
echo %~1\AppData\Local\NVIDIA
echo %~1\AppData\Local\Temp
echo %~1\AppData\LocalLow\Google

このスクリプトは非常に無頓着で、先に進んでrobocopyを実行し、ジョブファイルを削除しました。テスト中にこれらの行をコメントアウトし、errorlevelの完了後にrobocopyのチェックを追加します。

4
Evan Anderson

申し訳ありませんが、 https://docs.Microsoft.com/en-us/windows-server/administration/windows-commands/robocopy のドキュメントによると:

/ xf <FileName> [...]指定された名前またはパスに一致するファイルを除外します。 FileNameにはワイルドカード文字(*および?)を含めることができることに注意してください。
/xd <ディレクトリ> [...]指定された名前とパスに一致するディレクトリを除外します。

つまり、これは特に、ワイルドカードを/ xfフラグで使用できるが、/ xdフラグでは使用できないことを意味します。

0
Peter