前回の続き。
前回の記事はこちら⇒WindowsコマンドとVBScriptでファイルバックアップ・世代管理-1
WindowsコマンドとVBScriptでファイルバックアップ・世代管理処理を行う。
なお、今回作成したスクリプトは以下の2本です。
- backup.bat
- file_generation.vbs
開始ログ出力(Windowsコマンド)
まずは、ログ出力。
日付は「%date%」、時刻は「%time%」で取得できる。
ただし、日付は「/」、時刻は「:」と「.」が入っているので、それらを除外する。
「%X:~0,4%」とすると、文字列Xの0文字目から4文字分取得できる。
時刻は、時間が1桁の場合、先頭が空白になってしまうので、置換してやる。
「%X:a=b%」とすると、文字列Xのaをbに置換できる。
REM 開始時間設定 set tmpTime=%time: =0% set logTime=%date:~0,4%%date:~5,2%%date:~8,2%_%tmpTime:~0,2%%tmpTime:~3,2%%tmpTime:~6,2% REM 開始ログ出力 echo %logTime% バックアップ処理開始。 >> backup.logファイルバックアップ(Windowsコマンド)
続いて、ファイルバックアップ。
ファイルコピーは「cp」コマンド。
もしエラーとなった場合は、「if」と「ERRORLEVEL」を使用して条件分岐し、エラーログを出力する。
「ERRORLEVEL」は、コマンドが正常終了した場合は「0」、異常終了した場合は「1」となるので、「0」以外の場合はエラーログを出力するようにしている。
なお、バックアップ対象ファイルは、コマンドライン第1引数。
バックアップファイルはファイル名先頭に日時を付け、「backup」フォルダにコピーする。
REM ファイルバックアップ cp %1 backup/%logTime%_%1 REM 上記コマンドエラーの場合、エラーメッセージ出力 if %ERRORLEVEL% neq 0 echo ERROR-001:ファイルバックアップ処理失敗。 >> backup.logバックアップファイル世代管理(VBScriptファイル呼び出し)
まずは、バックアップファイル世代管理処理(VBScript)を呼び出すところ。
コマンドライン第2引数を管理ファイル数として引き渡す。
REM バックアップファイル世代管理処理呼び出し(引数:管理ファイル数) file_generation.vbs %2 REM 上記コマンドエラーの場合、エラーメッセージ出力 if %ERRORLEVEL% neq 0 echo ERROR-002:バックアップファイル世代管理処理失敗。 >> backup.log続いて、バックアップファイル世代管理処理のVBScript。
ファイル一覧取得はWindowsコマンド「dir」を使用して更新日時昇順で取得し、その結果をループさせ配列に格納する。
そのコマンドは「dir /a-d /b /od backup」。
「/a-d」でディレクトリを除く一覧を取得、「/b」でファイル名のみを表示、「od」で日時順で一覧を取得といった感じ。
ファイル削除時の例外処理は、ファイル削除箇所の前に「On Error Resume Next」と書き、ファイル削除箇所の後「If Err.Number <> 0 Then」で例外処理をしている。
例外発生時は、「WScript.Quit(1)」でコマンドラインに「1」(エラー)を返すようにしている。
Option Explicit '変数初期化 Dim fso, shell, exec, str(), cnt, delCnt, param cnt=0 'パラメータ取得 Set param = WScript.Arguments 'ファイルオブジェクト Set fso = WScript.CreateObject("Scripting.FileSystemObject") 'シェルオブジェクト Set shell = CreateObject("WScript.Shell") 'コマンド実行(更新日時昇順のファイル一覧取得) Set exec = shell.Exec("cmd /c dir /a-d /b /od backup") '取得結果をループさせ、配列格納 Do While Not exec.StdOut.AtEndOfStream ReDim Preserve str(cnt) str(cnt) = exec.StdOut.ReadLine cnt = cnt + 1 Loop '削除ファイル数計算 delCnt = cnt - param(0) '削除ファイル数が1以上の場合、ファイル削除 If delCnt &gt;= 1 Then For cnt = 0 To delCnt - 1 'エラー処理(次処理) On Error Resume Next 'ファイル削除処理 fso.DeleteFile "backup\" &amp; str(cnt), False 'エラーの場合、コード「1」を返却 If Err.Number &lt;&gt; 0 Then WScript.Quit(1) End If Next End If終了ログ出力(Windowsコマンド)
最後に、再びログ出力。
REM 終了時間設定 set tmpTime=%time: =0% set logTime=%date:~0,4%%date:~5,2%%date:~8,2%_%tmpTime:~0,2%%tmpTime:~3,2%%tmpTime:~6,2% REM 終了ログ出力 echo %logTime% バックアップ処理終了。 &gt;&gt; backup.log実行
実行はこんな感じで、第1引数にバックアップ対象ファイル、第2引数にバックアップファイル世代管理数を指定し、実行する。
C:>backup.bat test.txt 4ログファイル「backup.log」はこんな感じで出力されます。
2行目、3行目はエラー時にのみ出力されます。
20130429_101432 バックアップ処理開始。 ERROR-001:ファイルバックアップ処理失敗。 ERROR-002:バックアップファイル世代管理処理失敗。 20130429_101432 バックアップ処理終了。ふう、ようやく完成したー。
参考サイト
ERRORLEVELについてのメモ (1) – とあるソフトウェア開発者のブログ
Windows TIPS:バッチ・ファイル中で日付をファイル名に使用する – @IT
@IT:Windows TIPS — Tips:dirコマンドでファイル名の一覧を取得する
基礎解説 演習方式で身につけるチェック式WSH超入門:第9回 VBScriptのオブジェクトを使いこなす (2/4) – @IT
コメント