目次

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\

になっている。\\が \に変換された結果 “ に影響をあたえる \ がなくなり、” はすべて除去されたと思われる。