kakakakakku blog

Weekly Tech Blog: Keep on Learning!

XCOPY コマンドまとめ

最近,XCOPYコマンドを使ってそこそこ大規模にコードを書いたので,そのときに考えたXCOPYコマンドの自分用コード規約をまとめておこうと思う.XCOPYコマンドっていざ書こうと思ったときにオプションが思い出せなくて「xcopy /?」したりすることが多いので,見返すエントリーがあると便利なはず.

構文方針

・オプションはコマンドの末尾に付けること.
・XCOPY元とXCOPY先をダブルクォーテーションで囲むこと(フォルダ名にスペースが存在すると余分な引数として認識されてしまうため).
・XCOPY元としてフォルダを指定する場合,フォルダ名の末尾に\を付けないこと.
・XCOPY先としてフォルダを指定する場合,フォルダ名の末尾に\を付けること.

【例】
XCOPY "C:\XCOPY_FR" "C:\XCOPY_TO\" /E /F /H /K /R /Y /C /V

オプション方針(一般用)

・/E 空であってもサブディレクトリをコピーする.
・/F コピー元とコピー先のログを出力する.
・/H 隠しファイル属性・システムファイル属性もコピーする.
・/K 読み取り専用ファイルの属性も維持してコピーする.
・/R 読み取り専用ファイルも上書きコピーする.
・/Y コピー先に既にファイルがある場合も確認メッセージを表示しないでコピーを続行する.

オプション方針(問題対策用)

・/C エラーが発生してもコピーを続行させる.
・/V コピーファイルを検証する.

/EXCLUDEオプションを活用した除外リストコピー

データ移行対象となるフォルダ数が多い場合は,上位階層レベルでのXCOPYコマンドを1行書き、/EXCLUDEオプションを活用した除外リスト方式を使うとバッチファイルを簡略化することができる.除外リストは「exclude.list」とし,オプションの書き方は「/EXCLUDE:C:\exclude.list」とする.

ただし,除外リストに定義するのはあくまで部分文字列にすぎないので,例えば「.log」と除外リストに定義してしまうと,拡張子が.logのファイルだけでなく,ファイルの絶対パスに.logが含まれているファイルも全て除外されてしまう点に注意する.特定のフォルダ全体を除外する場合は,除外リストに「ドライブ名:\フォルダ名\」と定義する.

【例】
XCOPY "C:\XCOPY_FR" "C:\XCOPY_TO\" /EXCLUDE:C:\exclude.list /E /F /H /K /R /Y /C /V

動作例として,Cドライブ直下に「XCOPY_FR」「XCOPY_TO」フォルダが以下のような構成で作成されているとする.

C:\>tree /F XCOPY_FR
C:\XCOPY_FR
├─DirA
│ A1.log
│ A2.log

└─DirB
B1.log

C:\>tree /F XCOPY_TO
C:\XCOPY_TO
サブフォルダは存在しません

除外リストの定義は以下のようにする.

C:\>type exclude.list
C:\XCOPY_FR\DirB\

除外リストを活用してコピーを実施するとちゃんとDirBフォルダ直下が全て除外されている.

C:\>XCOPY "C:\XCOPY_FR" "C:\XCOPY_TO\" /EXCLUDE:C:\exclude.list /E /F /H /K /R /Y /C /V
C:\XCOPY_FR\DirA\A1.log -> C:\XCOPY_TO\DirA\A1.log
C:\XCOPY_FR\DirA\A2.log -> C:\XCOPY_TO\DirA\A2.log
2 個のファイルをコピーしました

共通コードのサンプル

コードが複数ある場合,共通コードを1つ用意して共通定義などをまとめておくと保守性が高まる.今回は日付定数やログファイル名などの定義を共通化した.

set TODAY=%date:~0,4%%date:~5,2%%date:~8,2%
set LOGFILEPATH=C:\%TODAY%_%FILENAME%.log
set STARTSTRING=処理開始:::
set ENDSTRING=処理終了:::

また全てのコードを以下のテンプレートから開発するようにした.

set FILENAME=%~n0
CALL %~dp0common.bat

REM 開始時刻
echo %STARTSTRING%%FILENAME% >> %LOGFILEPATH%
date /t >> %LOGFILEPATH%
time /t >> %LOGFILEPATH%

REM メイン処理

REM 終了時刻
date /t >> %LOGFILEPATH%
time /t >> %LOGFILEPATH%
echo %ENDSTRING%%FILENAME% >> %LOGFILEPATH%

出力されたログは以下のようになる.

処理開始:::xcopy_sample_001
2011/12/09
19:00
2011/12/09
19:00
処理終了:::xcopy_sample_001

バイブル

ちなみにプロジェクトの自席にはDOS辞典を置いていてすぐ調べられるようにしている.数あるDOS解説本の中で個人的には一番実用的で詳しく載っている本だと思うので,今回テーマのXCOPYに限らず,いろんな自動化に挑戦するのが好きなエンジニアにお薦めできる.

Windows DOS/コマンドプロンプト辞典

Windows DOS/コマンドプロンプト辞典