2016/06/23
自分用メモ
こんなバッチファイルを作成。
@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 に適用できればディレクトリの数に動的に対応できる。
sample1.batを修正してROBOCOPYコマンドを呼び出す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を作成。
@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\
になっている。\\が \に変換された結果 “ に影響をあたえる \ がなくなり、” はすべて除去されたと思われる。