自作バッチメモ

自作のバッチ置き場です。

限定的な使い方しかしていないので、いろいろ不備が多いのでご容赦を。
ファイルの持ち込み等ができない派遣先でも見られるように置いておきます。

# 差分ミラーコピー補助バッチ
 Windws標準のrobocopyを使用して、簡単な設定ファイルをもとに
差分ミラーコピーを取るバッチです。一応、こんな感じで7年ほど使っていたものです。
WinXP/Win7/Win8/Win10で動作していました。

##バッチ内容（適当な名前で保存）
```MirrorCopy.bat(dos)
@echo off
echo ##############################################################
echo #   差分ミラーコピー補助バッチ    Created by @ayayuki888
ECHO # -----------------------------------------------------------
REM -[Guide]-
REM  Windows標準のrobocopyを使用してリストを元に同期コピーをします。
REM  ※WinXPでrobocopyを使うにはリソースキットの導入が必要です
REM  ※コピー用リストファイルは、コピー元とコピー先をパイプで
REM    区切って行単位で登録して下さい。
ECHO # Ver20150422
REM -----------------------------------------------------------
echo ##############################################################

:INIT
rem ############################################################
rem [設定] 自由に変更可
rem ############################################################
rem -------------------------
rem 	実行動作設定
rem -------------------------
rem 自動実行＆遅延モードのWAIT秒数
	SET WAIT_TIME=2

rem -------------------------
rem 	ログ設定用
rem -------------------------
rem ログを出力するかどうか（ON/OFF）
	SET LOG_SW=ON

rem ログファイル保存フォルダ
	SET LOG_DIR=.\Log\

rem ログの保存世代数
	SET LOG_DEL_SEDAI=5

rem 更新数の集計を行うかどうか（ON/OFF）
	SET LOG_CNT_SUM_SW=ON

rem ############################################################
rem [設定] 連携ツールの実行ファイル設定
rem ############################################################
rem -------------------------
rem robocopy オプション設定
rem ※オプションの詳細はWEBで検索して下さい
rem -------------------------
rem (参考)http://www.atmarkit.co.jp/ait/articles/1309/27/news116.html
rem [サンプル] SET RCOPY_OPT=/E /SEC /R:2 /W:10 /LOG:%LOG_FILE% /NP /TEE
rem [サンプル] SET RCOPY_OPT=/E /SEC /R:2 /W:10 /LOG:%LOG_FILE% /NP
rem [サンプル] RCOPY_OPT=/MIR /DCOPY:T /R:2 /W:10 /LOG:%LOG_FILE% /NP
rem [サンプル] RCOPY_OPT_LOGADD=/MIR /DCOPY:T /R:2 /W:10 /LOG+:%LOG_FILE% /NP
rem [サンプル] RCOPY_OPT_NOLOG=/MIR /DCOPY:T /R:2 /W:10
rem [サンプル]除外フォルダの指定とシステム・隠し属性を除外
rem      SET RCOPY_OPT_BASE=/MIR /DCOPY:T /R:2 /W:10 /xd "除外したいフォルダ1" "除外したいフォルダ2" /xa:sh
rem -- ROBOCOPYの基本設定
rem SET RCOPY_OPT_BASE=/MIR /DCOPY:T /R:2 /W:10 /xa:sh /NP
	SET RCOPY_OPT_BASE=/MIR /DCOPY:T /R:0 /W:10 /xa:sh /NP
	SET RCOPY_OPT_WORD=差分同期モード（ｼｽﾃﾑﾌｧｲﾙと隠し属性は除外）

rem -------------------------
rem サクラエディタ　Grep検索実行時のコマンド設定
rem -------------------------
SET LOG_GREP_APP=C:\Tool\Install\sakura\sakura.exe -GREPMODE
rem ※あとで下の２つのオプションを動的に追加して起動する
rem   -GFOLDER="%LOG_DIR_FULL%"
rem   -GFILE="%LOG_FILENM%"

rem -------------------------
rem 	Tail連動
rem -------------------------
rem Tailでのログ監視を行う場合、実行ファイルの絶対パスを設定(未使用時は空白）
rem 　(注)パスに半角スペースを含めないこと！
rem SET LOG_TAIL_EXE=C:\Tool\Copy\TAIL\tail.exe
SET LOG_TAIL_EXE=

rem ############################################################
rem [設定] 基本的には変更不要な設定
rem ############################################################
rem -------------------------
rem ログのチェックキーワード
rem -------------------------
rem ★よく出るエラーメッセージ★
rem  エラー 2 (0x00000002) 指定されたファイルが見つかりません。
rem  エラー 3 (0x00000003)指定されたパスが見つかりません。
rem  エラー 123 (0x0000007B) ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
	SET LOG_CHKKEY_ERR= (0x0000

rem ★件数カウント用キーワード　※(")は不要
rem for Windows VISTA以降のバージョン
	SET LOG_CHKKEY_DIR=   ディレクトリ:
	SET LOG_CHKKEY_FILE=     ファイル:
rem for Windows XP
	SET LOG_CHKKEY_DIR_XP=     Dirs :  
	SET LOG_CHKKEY_FILE_XP=    Files :  

rem ############################################################
rem 以下は処理部分です。変更の必要はありません（たぶん
rem ############################################################

rem タイムスタンプを取得
set YYYYMMDD=%date:~0,4%%date:~5,2%%date:~8,2%
set HHMMSS=%time:~0,2%%time:~3,2%%time:~6,2%
set HHMMSS=%HHMMSS: =0%
SET TIMESTAMP=%YYYYMMDD%_%HHMMSS%

REM 遅延環境変数ON
setlocal enabledelayedexpansion

REM ------------------------------------------------
REM オプションスイッチ　初期化
REM ------------------------------------------------
  REM 【/A】自動実行モード
  SET OPT_AUTO=OFF
  REM 【/T】Tailモード
  SET OPT_TAIL=OFF
  REM 【/W】遅延実行モード（自動モードの場合。１０秒固定）ping localhost -n 10 > nul
  SET OPT_WAIT=OFF

REM ------------------------------------------------
REM 実行時のパスを取得（ネットワーク対応）
REM ------------------------------------------------
rem バッチファイルのパスを取得
for /F "delims=" %%F in ('echo %0') do set BAT_DIR=%%~dpF

rem ログディレクトリへの絶対パス取得
for /F "delims=" %%F in ('echo %BAT_DIR%%LOG_DIR%') do set LOG_DIR_FULL=%%~dpF


REM ------------------------------------------------
REM 引数解析処理（オプションとパラメータの分割）
REM ------------------------------------------------
REM パラメータのインデックス番号を初期化する。
SET ARGS_INDEX=0
:START_PARSE_ARGMENTS
  REM 次の引数を取得する（初回は%1）
  SHIFT
  SET TMP_ARGS=%0

  REM TMP_ARGS環境変数の有無で該当引数が存在すると判断する。
  IF DEFINED TMP_ARGS (
    IF /i !TMP_ARGS! EQU /A (
      rem 【/A】自動実行モード：ON
      SET OPT_AUTO=ON
    ) ELSE IF /i !TMP_ARGS! EQU /T (
      rem 【/T】Tailモード：ON
      SET OPT_TAIL=ON
    ) ELSE IF /i !TMP_ARGS! EQU /W (
      rem 【/W】遅延実行モード：ON
      SET OPT_WAIT=ON
    ) ELSE (
      rem 想定されたオプション以外の値は環境変数ARGn（nは1以上）にそのまま設定する。
      SET /A ARGS_INDEX=%ARGS_INDEX%+1
      SET ARG!ARGS_INDEX!=!TMP_ARGS!
    )
  ) ELSE (
    REM 引数が存在しなくなった場合は、引数解析処理を抜ける。
    GOTO END_PARSE_ARGMENTS
  )

GOTO START_PARSE_ARGMENTS
:END_PARSE_ARGMENTS

ECHO --- [実行時パラメータ] ---------------------------------------
ECHO 【/A】自動実行モード:%OPT_AUTO%
ECHO 【/T】Tailモード:%OPT_TAIL%
ECHO 【/W】遅延実行:%OPT_WAIT%
ECHO 引数１：%ARG1%
ECHO --------------------------------------------------------------

:SETP0
rem -------------------------
rem 引数をセット
rem 	引数１：使用するリストファイル名（フルパス）
rem 	引数２：実行モード（A=自動、未設定：手動）
rem -------------------------
rem echo %ARG1%
rem pause

IF '%ARG1%' == "" (
ECHO 設定ファイルが指定されていません。
GOTO END_PAUSE
) ELSE (
SET COPY_LIST=%ARG1%
)

rem ファイル名部分だけ取得
for /F "delims=" %%F in ('echo %COPY_LIST%') do set COPY_LIST_FILENM=%%~nF
rem (")がついたりついてなくても対応出来るよう完全修飾パス名を取得
for /F "delims=" %%F in ('echo %COPY_LIST%') do set COPY_LIST_FULLPATH=%%~fF

rem ファイルの存在チェック
IF NOT EXIST "%COPY_LIST_FULLPATH%" (
echo 設定ファイルが見つかりません。
echo %COPY_LIST_FULLPATH%
GOTO END_PAUSE
)

rem -----------------------------
rem --ログの有無による設定
rem IF分の中でSETすると分岐終了まで反映しないので毎回スイッチをきく
rem -----------------------------
IF "%LOG_SW%" == "ON" (
rem ログファイル設定
rem ※絶対パスに変換
rem ※ファイル名部分の半角ｽﾍﾟｰｽは除去

rem ログファイル名生成（ファイル名のみ）
	SET LOG_FILENM=%COPY_LIST_FILENM: =%_%TIMESTAMP%.log
rem ログファイルへのパス(絶対パス)
	SET LOG_FILE=%LOG_DIR_FULL%%COPY_LIST_FILENM: =%_%TIMESTAMP%.log
rem ログファイルのワイルドカード(絶対パス)
	SET LOG_FILE_WILD=%LOG_DIR_FULL%%COPY_LIST_FILENM: =%*.log

) ELSE (
	SET LOG_FILE=
)

IF "%LOG_SW%" == "ON" (
	rem ROBOCOPYにログ出力オプション追加
	SET RCOPY_OPT_EXEC=%RCOPY_OPT_BASE% /LOG+:"%LOG_FILE%" /NP
) ELSE (
	SET RCOPY_OPT_EXEC=%RCOPY_OPT_BASE%
)

rem 各設定値を表示
ECHO 設定ファイル名　　　：%COPY_LIST_FULLPATH%
echo バッチ実行時フォルダ：%BAT_DIR%
IF "%LOG_FILE%" == "" (
	ECHO ログファイル：無し
) ELSE (
	ECHO ログ出力ディレクトリ：%LOG_DIR_FULL%
	ECHO ログファイル名　　　：%LOG_FILENM%
	ECHO ログファイルパス　　：%LOG_FILE%
	ECHO ログ世代管理ワイルド：%LOG_FILE_WILD%
)

:SETP1
ECHO ---[ コピー設定 ] --------------------------------------------

set /a cnt=0
rem 除外フォルダ(１２個まで）
for /f "usebackq tokens=1-14 delims=| eol=#" %%i in ("%COPY_LIST_FULLPATH%") do (

	set /a cnt+=1

	echo [設定!cnt!]
	echo コピー元 ：%%i
	echo コピー先 ：%%j
	echo 除外ﾌｫﾙﾀﾞ：%%k %%l %%m %%n %%o %%p %%q %%r %%s %%t %%u %%v
	echo ----------
)

REM 自動実行だったら確認を飛ばす
if %OPT_AUTO%==ON GOTO INIT_PROC

:SETP2
ECHO --------------------------------------------------------------
ECHO [robocopyコマンド]
ECHO %RCOPY_OPT_EXEC%
ECHO [コピーモード] %RCOPY_OPT_WORD%
ECHO --------------------------------------------------------------
ECHO ミラーコピーを開始します。宜しいですか？ (y/n)
SET /p ans=
if "%ans%"=="Y" GOTO INIT_PROC
if "%ans%"=="y" GOTO INIT_PROC

GOTO END_EXIT

:INIT_PROC
IF %OPT_AUTO%==ON (
IF %OPT_WAIT%==ON (
echo 自動実行モード（%WAIT_TIME%秒の遅延待機中・・・
ping localhost -n %WAIT_TIME% > nul
echo 遅延終了。処理を開始します。
)
)

REM 処理開始時刻を取得
SET S_DATE=%DATE: =0%
SET S_TIME=%TIME: =0%

IF "%LOG_SW%" == "ON" (
rem ログフォルダがなかったら作る
	IF NOT EXIST "%LOG_DIR_FULL%" (MD "%LOG_DIR_FULL%")
)


rem [ADD] Ver1.7：2015/04/20
rem ログファイルを空で作成後、tailアプリを非同期実行
IF %OPT_TAIL%==ON (
IF NOT "%LOG_FILE%" == "" (
IF NOT "%LOG_TAIL_EXE%" == "" (
rem 空ファイルを作成
type nul > "%LOG_FILE%"

echo Tail連携起動
rem Tail非同期実行(パスに半角スペースを含めないこと）
start "" %LOG_TAIL_EXE% %LOG_FILE%
)
)
)


:COPYFILE
ECHO ---------------------------------------------------------
ECHO ファイルの差分ミラーコピーを開始します。
ECHO ---------------------------------------------------------
set /a cnt=0
for /f "usebackq tokens=1-14 delims=| eol=#" %%i in ("%COPY_LIST_FULLPATH%") do (
set /a cnt+=1
Set Line1=%%i
if "!Line1:~0,1!"=="#" SET SkipCHR=:SKIP

rem 除外フォルダオプション生成
SET RCOPY_XD=
if "%%k" NEQ "" (
SET RCOPY_XD=/xd %%k %%l %%m %%n %%o %%p %%q %%r %%s %%t %%u %%v
)

echo [!cnt!]コピー元：%%i
echo [!cnt!]コピー先：%%j
echo [!cnt!]コマンド：robocopy %%i %%j %RCOPY_OPT_EXEC% !RCOPY_XD!
echo [!cnt!]コピー開始＞＞＞

rem robocopy 実行
robocopy %%i %%j %RCOPY_OPT_EXEC% !RCOPY_XD!
echo [!cnt!]＜＜＜コピー終了
ECHO ---------------------------------------------------------
)

REM ------------------------------------------
REM 処理の実行時間を計算
REM ------------------------------------------
:EXEC_TIME_CALC

REM --開始時刻を分解
SET ST_H=%S_TIME:~0,2%
SET ST_M=%S_TIME:~3,2%
SET ST_S=%S_TIME:~6,2%
rem --8進対策
set /a ST_H=1%ST_H%-100
set /a ST_M=1%ST_M%-100
set /a ST_S=1%ST_S%-100 

REM --処理終了時刻を取得
SET E_DATE=%DATE: =0%
SET E_TIME=%TIME: =0%
SET ED_H=%E_TIME:~0,2%
SET ED_M=%E_TIME:~3,2%
SET ED_S=%E_TIME:~6,2%
rem --8進対策
set /a ED_H=1%ED_H%-100
set /a ED_M=1%ED_M%-100
set /a ED_S=1%ED_S%-100

rem --終了時間の計算
rem 時 (日跨ぎは考慮しない）
SET /a CALC_H=ED_H - ST_H
 
rem 分
SET /a CALC_M=ED_M - ST_M
if %CALC_M% LSS 0 set /a CALC_H = CALC_H - 1
if %CALC_M% LSS 0 set /a CALC_M = CALC_M + 60
 
rem 秒
SET /a CALC_S = ED_S - ST_S
if %CALC_S% LSS 0 set /a CALC_M = CALC_M - 1
if %CALC_S% LSS 0 set /a CALC_S = CALC_S + 60

rem 分と秒は桁数を3桁にする（後で下2桁を取る）
SET /a CALC_M = %CALC_M% + 100
SET /a CALC_S = %CALC_S% + 100

ECHO 開始時間：%S_DATE% %S_TIME%
ECHO 終了時間：%E_DATE% %E_TIME%
rem 経過時間　※日跨いだ時は出さない（ただの手抜き）
if %CALC_H% GEQ 0 ECHO 経過時間：%CALC_H%時間%CALC_M:~1,2%分%CALC_S:~1,2%秒


REM ------------------------------------------
REM ログファイル削除処理
REM ------------------------------------------
:LOG_OLDDEL_PROC
REM --- [ ログファイル削除 ] --------
echo ---------------------------------------------------------
ECHO 古いログファイルを削除します（保存世代数：%LOG_DEL_SEDAI%）
ECHO ・・・

rem 「ファイル名」リストが日付（降順）で取得出来るので世代数分SKIPして削除する
for /f "skip=%LOG_DEL_SEDAI%" %%A in ('dir /b /o-d "%LOG_FILE_WILD%"') do (
del /q "%LOG_DIR_FULL%%%A"
)
ECHO 古いログファイルの削除が完了しました。（第%LOG_DEL_SEDAI%世代まで残す）

REM ------------------------------------------
REM 終了処理分岐
REM ------------------------------------------
rem 自動実行だったらそのまま終了
if %OPT_AUTO%==ON GOTO END_EXIT

rem ログ出力がない場合はそのまま終了
IF "%LOG_SW%" NEQ "ON" GOTO END_PAUSE

rem ログから集計をしない場合はチェック処理へ
IF "%LOG_CNT_SUM_SW%" NEQ "ON" GOTO END_PAUSE

REM ------------------------------------------
REM ログの更新件数を調べる
REM         ADD Ver1.3：2013/12/19
REM ------------------------------------------
:PROC_LOGCHK

rem ※ログの以下の部分のカウントを判断しています。
rem  ---------*---------*---------*---------*---------*---------*---------*
rem |                Total    Copied   Skipped  Mismatch    FAILED    Extras
rem |     Dirs :        56         5        51         0         0         0
rem |    Files :       257       113       144         0         0        22
rem  0123456789012345678901234567890123456789012345678901234567890123456789

ECHO ---------------------------------------------------------
ECHO ＞＞＞実行結果ログ解析開始

rem 集計用変数初期化
set /a cnt_dir_total=0
set /a cnt_dir_copy=0
set /a cnt_dir_fail=0
set /a cnt_dir_extra=0
set /a cnt_file_total=0
set /a cnt_file_copy=0
set /a cnt_file_fail=0
set /a cnt_file_extra=0
set /a Lcnt=0

rem ------------------------------
rem OSバージョン判定
rem ------------------------------
rem Windows 2000				5.00.xxxx
rem Windows XP (x86)			5.1.xxxx
rem Windows XP (x64)			5.2.xxxx
rem Windows Server 2003		5.2.xxxx
rem Windows Vista			6.0.xxxx
rem Windows Server 2008		6.0.xxxx
rem Windows 7				6.1.xxxx
rem Windows Server 2008 R2	6.1.xxxx
rem Windows 8				6.2.xxxx
rem Windows Server 2012		6.2.xxxx
rem Windows 8.1				6.3.xxxx
rem Windows Server 2012 R2	6.3.xxxx
echo OSバージョン
VER

VER | find "95" > nul 
IF not errorlevel 1 GOTO PROC_LOGCHK_unknown
VER | find "98" > nul 
IF not errorlevel 1 GOTO PROC_LOGCHK_unknown
VER | find "NT" > nul 
IF not errorlevel 1 GOTO PROC_LOGCHK_unknown
VER | find "2000" > nul 
IF not errorlevel 1 GOTO PROC_LOGCHK_XP
VER | find "XP" > nul 
IF not errorlevel 1 GOTO PROC_LOGCHK_XP
VER | find "Version 5.2." > nul
IF not errorlevel 1 GOTO PROC_LOGCHK_XP
VER | find "Version 6.0." > nul
IF not errorlevel 1 GOTO PROC_LOGCHK_VISTA
VER | find "Version 6.1." > nul
IF not errorlevel 1 GOTO PROC_LOGCHK_VISTA
VER | find "Version 6.2." > nul
IF not errorlevel 1 GOTO PROC_LOGCHK_VISTA
VER | find "Version 6.3." > nul
IF not errorlevel 1 GOTO PROC_LOGCHK_VISTA

GOTO PROC_LOGCHK_unknown

REM --------------------------
REM ---ログ解析XPの用
REM --------------------------
:PROC_LOGCHK_XP
rem Grep検索用キーワードセット
SET GREP_KEYWORD="%LOG_CHKKEY_DIR_XP%"

for /f "usebackq delims=" %%a in ("%LOG_FILE%") do (
Set Line1=%%a
	if "!Line1:~0,13!" EQU "%LOG_CHKKEY_DIR_XP%" (
		set /a cnt_dir_total+=!Line1:~11,10!
		set /a cnt_dir_copy +=!Line1:~21,10!
		set /a cnt_dir_fail +=!Line1:~51,10!
		set /a cnt_dir_extra+=!Line1:~61,10!
	)
	if "!Line1:~0,13!" EQU "%LOG_CHKKEY_FILE_XP%" (
		set /a cnt_file_total+=!Line1:~11,10!
		set /a cnt_file_copy +=!Line1:~21,10!
		set /a cnt_file_fail +=!Line1:~51,10!
		set /a cnt_file_extra+=!Line1:~61,10!
	)
)

GOTO PROC_LOGCHK_SUMMARY

REM --------------------------
REM ---ログ解析VISTA以降用
REM --------------------------
:PROC_LOGCHK_VISTA

rem Grep検索用キーワードセット
SET GREP_KEYWORD="より新しい |より古い |\*EXTRA File |\*EXTRA Dir |新しいファイル |新しいディレクトリ "

for /f "usebackq delims=" %%a in ("%LOG_FILE%") do (
Set Line1=%%a
	if "!Line1:~0,10!" EQU "%LOG_CHKKEY_DIR%" (
		set /a cnt_dir_total+=!Line1:~11,10!
		set /a cnt_dir_copy +=!Line1:~21,10!
		set /a cnt_dir_fail +=!Line1:~51,10!
		set /a cnt_dir_extra+=!Line1:~61,10!
	)
	if "!Line1:~0,10!" EQU "%LOG_CHKKEY_FILE%" (
		set /a cnt_file_total+=!Line1:~11,10!
		set /a cnt_file_copy +=!Line1:~21,10!
		set /a cnt_file_fail +=!Line1:~51,10!
		set /a cnt_file_extra+=!Line1:~61,10!
	)
)

GOTO PROC_LOGCHK_SUMMARY

REM --------------------------
REM ---ログ解析不可
REM --------------------------
:PROC_LOGCHK_unknown
ECHO 対応していないOSの為、ログチェックをしませんでした。

GOTO END_PAUSE

REM --------------------------
REM ---ログ集計結果
REM --------------------------
:PROC_LOGCHK_SUMMARY
ECHO ＜＜＜実行結果ログ解析終了
echo ---------------------------------------------------------
ECHO 【ミラーコピー　集計情報】
echo 　〔フォルダ〕
echo 　　対象数　　　　：%cnt_dir_total%
echo 　　コピー数　　　：%cnt_dir_copy%
echo 　　コピー(失敗)数：%cnt_dir_fail%　　※ﾌｧｲﾙがﾛｯｸされている場合など
echo 　　不要削除数　　：%cnt_dir_extra%　　※コピー先の不要ﾌｧｲﾙ削除など
echo 　〔ファイル〕
echo 　　対象数　　　　：%cnt_file_total%
echo 　　コピー数　　　：%cnt_file_copy%
echo 　　コピー(失敗)数：%cnt_file_fail%　　※ﾌｧｲﾙがﾛｯｸされている場合など
echo 　　不要削除数　　：%cnt_file_extra%　　※コピー先の不要ﾌｧｲﾙ削除など
echo ---------------------------------------------------------

REM ------------------------------------------
REM ログのエラー発生をキーワードで調べる
REM ------------------------------------------
:CHK_PROC
rem ログファイルを検索
FINDSTR /c:"%LOG_CHKKEY_ERR%" "%LOG_FILE%" > NUL
IF %ERRORLEVEL% NEQ 0 GOTO LOG_KAKUNIN_NORMAL

echo ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
echo エラーチェックキーワードがログから検出されました。
echo [キーワード]
echo %LOG_CHKKEY_ERR%
echo ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
echo 【ログの見方】主なもの (for WindowsXP)
echo Lonely  : 転送元には存在するが転送先に存在しないﾌｧｲﾙ
echo Same    : 転送元と転送先両方に存在し，ﾀｲﾑｽﾀﾝﾌﾟもサイズも属性も同じﾌｧｲﾙ
echo Tweaked : 転送元と転送先両方に存在し，ﾀｲﾑｽﾀﾝﾌﾟもサイズも同じだが、
echo           属性だけが異なるﾌｧｲﾙ
echo Changed : 転送元と転送先両方に存在し，ﾀｲﾑｽﾀﾝﾌﾟは同じだが，サイズ異なるﾌｧｲﾙ
echo Newer   : 転送元と転送先両方に存在するが，転送元のﾀｲﾑｽﾀﾝﾌﾟの方が新しいﾌｧｲﾙ
echo Older   : 転送元と転送先両方に存在するが，転送元のﾀｲﾑｽﾀﾝﾌﾟの方が古いﾌｧｲﾙ
echo Extra   : 転送元に存在しないのに転送先に存在するﾌｧｲﾙ
echo Mismatched : 転送元のﾌｧｲﾙと同名のディレクトリが転送先にある（あるいはその逆）
echo ---------------------------------------------------------

REM ------------------------------------------
REM ログのエラー確認
REM ------------------------------------------
:LOG_KAKUNIN_ERR
echo ログファイルをテキストエディタで開きますか？
echo （y：開く、g：エラーをGrep検索、それ以外：そのまま終了）
set /p ansF=

if "%ansF%"=="G" GOTO PROC_GREPEXEC_ERR
if "%ansF%"=="g" GOTO PROC_GREPEXEC_ERR
if "%ansF%"=="Y" GOTO PROC_FILEOPEN
if "%ansF%"=="y" GOTO PROC_FILEOPEN

GOTO END_EXIT


REM ------------------------------------------
REM ログの確認
REM ------------------------------------------
:LOG_KAKUNIN_NORMAL

echo ログファイルをテキストエディタで開きますか？
echo （y：開く、g：コピー件数部分をGrep検索、それ以外：そのまま終了）
set /p ansF=

if "%ansF%"=="G" GOTO PROC_GREPEXEC_NORMAL
if "%ansF%"=="g" GOTO PROC_GREPEXEC_NORMAL
if "%ansF%"=="Y" GOTO PROC_FILEOPEN
if "%ansF%"=="y" GOTO PROC_FILEOPEN

GOTO END_EXIT

REM ------------------------------------------
REM 終了処理
REM ------------------------------------------
:END_PAUSE
echo 処理を終了します。
pause

:END_EXIT
REM 遅延環境変数OFF
endlocal
EXIT

REM ------------------------------------------
REM 関連付けされたファイルを開いて処理終了
REM ------------------------------------------
:PROC_FILEOPEN
start "" "%LOG_FILE%"

GOTO END_EXIT

REM ------------------------------------------
rem ログのGrep検索実行（通常用）
REM ------------------------------------------
:PROC_GREPEXEC_NORMAL
echo Grep検索実行呼び出し（通常用）
start "" %LOG_GREP_APP% -GFOLDER="%LOG_DIR_FULL%" -GFILE="%LOG_FILENM%" -GKEY=%GREP_KEYWORD% -GOPT=[R]

GOTO END_EXIT

REM ------------------------------------------
rem ログのGrep検索実行（エラ－用）
REM ------------------------------------------
:PROC_GREPEXEC_ERR
echo Grep検索実行呼び出し（エラ－用）
start "" %LOG_GREP_APP% -GFOLDER="%LOG_DIR_FULL%" -GFILE="%LOG_FILENM%" -GKEY="%LOG_CHKKEY_ERR%"

GOTO END_EXIT

REM ------------------------------------------
REM フォルダ開いて処理終了	（未使用）
REM ------------------------------------------
:PROC_DIROPEN
IF "%DLL_2_PATH%" == "" (
start explorer /e,"%DLL_1_PATH%\"
) else (
start explorer /e,"%DLL_2_PATH%\"
)
GOTO END_EXIT

```

## 設定ファイル（サンプル）
```
#-----------------------------------------------------
#   差分ミラーコピー用リスト
#
#[形式] "コピー元パス"|"コピー先パス"|"除外フォルダ１"|"除外フォルダ２"・・・|"除外フォルダ12"
#
#※パスは「"」でくくる事
#※区切り文字は「|」（パイプ）
#※除外フォルダは12個まで指定可能（ワイルドカード可能。省略可）
#※コメント行にする時は先頭１文字目に#（シャープ）
#※ファイル単位でのミラコーピーは出来ません（フォルダ単位です）
#-----------------------------------------------------
#-- 設定1
"C:\コピー元"|"D:\コピー先"|"Backup"
```

##使用手順
1. コピー設定用ファイルをテキストエディタで作成（サンプル参照）
2. バッチファイルを適当な名前で作成して、ショートカット作成
3. ショートカットのプロパティを開き、引数に設定ファイル名を指定
4. ショートカットを実行

##注意点
もともとWindowsXP時代に作ったものを無理やりWin10まで動作するように改修しています。
エラーチェック等はほとんど行っていないので、ご了承ください。