documents:windows:batch:batch-007
CMD.EXE FOR文とROBOCOPYコマンドの組み合わせメモ
2016/06/23
自分用メモ
バッチファイル実行
こんなバッチファイルを作成。
- sample1.bat
@echo off FOR /D %%d IN ("job*") DO ( FOR /D %%f IN ("%%d\*") DO ( CALL :mkcmdline "%%~nxd" "%%~nxf" ) ) EXIT /b 0 :mkcmdline echo H:\job\%1\%2 H:\job\backup\%1\%2
これを以下の環境で実行してみる。
h:\job>dir ドライブ H のボリューム ラベルは LaCie です ボリューム シリアル番号は 82D7-3881 です h:\job のディレクトリ 2016/06/23 00:42 <DIR> . 2016/06/23 00:42 <DIR> .. 2016/06/23 00:28 <DIR> backup 2016/06/23 00:37 <DIR> job 7 8 2016/06/23 00:34 <DIR> job1 2016/06/23 00:35 <DIR> job2 2016/06/23 00:36 <DIR> job3.1.1 2016/06/23 00:36 <DIR> job5&6 2016/06/23 00:39 185 sample1.bat 1 個のファイル 185 バイト 8 個のディレクトリ 2,441,088,843,776 バイトの空き領域 h:\job>tree H:\job フォルダー パスの一覧: ボリューム LaCie ボリューム シリアル番号は 82D7-3881 です H:\JOB ├─backup ├─job 7 8 │ ├─child780 │ └─child781 ├─job1 │ ├─child10 │ └─child11 ├─job2 │ ├─child20 │ └─child21 ├─job3.1.1 │ ├─child3110 │ └─child3111 └─job5&6 ├─child560 └─child561 h:\job>sample1.bat H:\job\"job 7 8"\"child780" H:\job\backup\"job 7 8"\"child780" H:\job\"job 7 8"\"child781" H:\job\backup\"job 7 8"\"child781" H:\job\"job1"\"child10" H:\job\backup\"job1"\"child10" H:\job\"job1"\"child11" H:\job\backup\"job1"\"child11" H:\job\"job2"\"child20" H:\job\backup\"job2"\"child20" H:\job\"job2"\"child21" H:\job\backup\"job2"\"child21" H:\job\"job3.1.1"\"child3110" H:\job\backup\"job3.1.1"\"child3110" H:\job\"job3.1.1"\"child3111" H:\job\backup\"job3.1.1"\"child3111" H:\job\"job5&6"\"child560" H:\job\backup\"job5&6"\"child560" H:\job\"job5&6"\"child561" H:\job\backup\"job5&6"\"child561" h:\job>
パスがいい感じに展開されている。これを例えば、ROBOCOPYコマンドの source, destination に適用できればディレクトリの数に動的に対応できる。
ROBOCOPYコマンドに置き換えしてみる
sample1.batを修正してROBOCOPYコマンドを呼び出すsample2.batを作成。
- sample2.bat
@echo off FOR /D %%d IN ("job*") DO ( FOR /D %%f IN ("%%d\*") DO ( CALL :mkcmdline "%%~nxd" "%%~nxf" ) ) EXIT /b 0 :mkcmdline ROBOCOPY H:\job\%1\%2 H:\job\backup\%1\%2 /MIR
うまくいけばROBOCOPYがディレクトリの数だけ実行されるはず…
h:\job>sample2.bat ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:04 コピー元 - H:\job"job\ コピー先 - h:\job\7\ ファイル: 8"child780 オプション: /DCOPY:DA /COPY:DAT /R:1000000 /W:30 ------------------------------------------------------------------------------ エラー: 無効なパラメーター #4 : "H:\job\backup"job" 簡易な使用法 :: ROBOCOPY コピー元 コピー先 /MIR コピー元 :: コピー元ディレクトリ (ドライブ:\パスまたは \\サーバー \共有\パス)。 コピー先 :: コピー先ディレクトリ (ドライブ:\パスまたは \\サーバー \\共有\パス)。 /MIR :: 完全なディレクトリ ツリーをミラー化します。 詳細な使用方法については、ROBOCOPY /? を実行してください。 **** /MIR はファイルをコピーできるだけでなく、削除もできます。 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:04 コピー元 - H:\job"job\ コピー先 - h:\job\7\ ファイル: 8"child781 オプション: /DCOPY:DA /COPY:DAT /R:1000000 /W:30 ------------------------------------------------------------------------------ エラー: 無効なパラメーター #4 : "H:\job\backup"job" 簡易な使用法 :: ROBOCOPY コピー元 コピー先 /MIR コピー元 :: コピー元ディレクトリ (ドライブ:\パスまたは \\サーバー \共有\パス)。 コピー先 :: コピー先ディレクトリ (ドライブ:\パスまたは \\サーバー \\共有\パス)。 /MIR :: 完全なディレクトリ ツリーをミラー化します。 詳細な使用方法については、ROBOCOPY /? を実行してください。 **** /MIR はファイルをコピーできるだけでなく、削除もできます。 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:04 コピー元 : H:\job"job1"child10\ コピー先 : H:\job\backup"job1"child10\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 2016/06/23 00:51:04 エラー 123 (0x0000007B) コピー元ディレクトリにアクセスしています H:\job"job1"child10\ ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:04 コピー元 : H:\job"job1"child11\ コピー先 : H:\job\backup"job1"child11\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 2016/06/23 00:51:04 エラー 123 (0x0000007B) コピー元ディレクトリにアクセスしています H:\job"job1"child11\ ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:04 コピー元 : H:\job"job2"child20\ コピー先 : H:\job\backup"job2"child20\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 2016/06/23 00:51:04 エラー 123 (0x0000007B) コピー元ディレクトリにアクセスしています H:\job"job2"child20\ ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:04 コピー元 : H:\job"job2"child21\ コピー先 : H:\job\backup"job2"child21\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 2016/06/23 00:51:04 エラー 123 (0x0000007B) コピー元ディレクトリにアクセスしています H:\job"job2"child21\ ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:04 コピー元 : H:\job"job3.1.1"child3110\ コピー先 : H:\job\backup"job3.1.1"child3110\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 2016/06/23 00:51:04 エラー 123 (0x0000007B) コピー元ディレクトリにアクセスしています H:\job"job3.1.1"child3110\ ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:04 コピー元 : H:\job"job3.1.1"child3111\ コピー先 : H:\job\backup"job3.1.1"child3111\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 2016/06/23 00:51:04 エラー 123 (0x0000007B) コピー元ディレクトリにアクセスしています H:\job"job3.1.1"child3111\ ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:04 コピー元 : H:\job"job5&6"child560\ コピー先 : H:\job\backup"job5&6"child560\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 2016/06/23 00:51:04 エラー 123 (0x0000007B) コピー元ディレクトリにアクセスしています H:\job"job5&6"child560\ ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 0:51:05 コピー元 : H:\job"job5&6"child561\ コピー先 : H:\job\backup"job5&6"child561\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 2016/06/23 00:51:05 エラー 123 (0x0000007B) コピー元ディレクトリにアクセスしています H:\job"job5&6"child561\ ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。 h:\job>
あれ? echo で出した時と違っている。
対処方法
echo は CMD.EXE の組み込みコマンド、ROBOCOPYは外部コマンド、の違いがある。
ROBOCOPYに限らず外部コマンドの時はダブルコーテーション(“)の削除が行われているように見える。
例えば
ROBOCOPY H:\job\"job5&6"\"child561" H:\job\backup\"job5&6"\"child561" /MIR
はメッセージによると
コピー元 : H:\job"job5&6"child561\ コピー先 : H:\job\backup"job5&6"child561\
になっている。残っている ” はおそらく \“ が ” に変換された結果で、この部分は書き換えが行われないのであろうと思われる。
試行錯誤し、sample2.batを修正してパスの文字列が正しく出るsample3.batを作成。
- sample3.bat
@echo off FOR /D %%d IN ("job*") DO ( FOR /D %%f IN ("%%d\*") DO ( CALL :mkcmdline "%%~nxd" "%%~nxf" ) ) EXIT /b 0 :mkcmdline ROBOCOPY H:\job\\%1\\%2 H:\job\backup\\%1\\%2 /MIR
結果はこの通り。
h:\job>sample2.bat ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:15 コピー元 : H:\job\job 7 8\child780\ コピー先 : H:\job\backup\job 7 8\child780\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job 7 8\child780\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:15 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:15 コピー元 : H:\job\job 7 8\child781\ コピー先 : H:\job\backup\job 7 8\child781\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job 7 8\child781\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:15 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:15 コピー元 : H:\job\job1\child10\ コピー先 : H:\job\backup\job1\child10\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job1\child10\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:15 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:15 コピー元 : H:\job\job1\child11\ コピー先 : H:\job\backup\job1\child11\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job1\child11\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:15 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:15 コピー元 : H:\job\job2\child20\ コピー先 : H:\job\backup\job2\child20\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job2\child20\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:15 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:15 コピー元 : H:\job\job2\child21\ コピー先 : H:\job\backup\job2\child21\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job2\child21\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:15 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:15 コピー元 : H:\job\job3.1.1\child3110\ コピー先 : H:\job\backup\job3.1.1\child3110\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job3.1.1\child3110\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:15 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:16 コピー元 : H:\job\job3.1.1\child3111\ コピー先 : H:\job\backup\job3.1.1\child3111\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job3.1.1\child3111\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:16 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:16 コピー元 : H:\job\job5&6\child560\ コピー先 : H:\job\backup\job5&6\child560\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job5&6\child560\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:16 ------------------------------------------------------------------------------- ROBOCOPY :: Windows の堅牢性の高いファイル コピー ------------------------------------------------------------------------------- 開始: 2016年6月23日 1:02:16 コピー元 : H:\job\job5&6\child561\ コピー先 : H:\job\backup\job5&6\child561\ ファイル: *.* オプション: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /R:1000000 /W:30 ------------------------------------------------------------------------------ 新しいディレクトリ 0 H:\job\job5&6\child561\ ------------------------------------------------------------------------------ 合計 コピー済み スキップ 不一致 失敗 Extras ディレクトリ: 1 1 0 0 0 0 ファイル: 0 0 0 0 0 0 バイト: 0 0 0 0 0 0 時刻: 0:00:00 0:00:00 0:00:00 0:00:00 終了: 2016年6月23日 1:02:16 h:\job>
コピー先、コピー元の展開も正しくできた。
ROBOCOPY H:\job\\"job5&6"\\"child561" H:\job\backup\\"job5&6"\\"child561" /MIR
はメッセージによると
コピー元 : H:\job\job5&6\child561\ コピー先 : H:\job\backup\job5&6\child561\
になっている。\\が \に変換された結果 “ に影響をあたえる \ がなくなり、” はすべて除去されたと思われる。
documents/windows/batch/batch-007.txt · 最終更新: 2023/04/14 02:32 by 127.0.0.1