WindowsコマンドとVBScriptでファイルバックアップ・世代管理-2

VBScriptプログラミング
この記事は約6分で読めます。

前回の続き。

前回の記事はこちら⇒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 >= 1 Then
  For cnt = 0 To delCnt - 1
    'エラー処理(次処理)
    On Error Resume Next

    'ファイル削除処理
    fso.DeleteFile "backup\" & str(cnt), False

    'エラーの場合、コード「1」を返却
    If Err.Number <> 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% バックアップ処理終了。 >> backup.log

実行

実行はこんな感じで、第1引数にバックアップ対象ファイル、第2引数にバックアップファイル世代管理数を指定し、実行する。

C:\>backup.bat test.txt 4

ログファイル「backup.log」はこんな感じで出力されます。

2行目、3行目はエラー時にのみ出力されます。

20130429_101432 バックアップ処理開始。
ERROR-001:ファイルバックアップ処理失敗。
ERROR-002:バックアップファイル世代管理処理失敗。
20130429_101432 バックアップ処理終了。

ふう、ようやく完成したー。

GitHub(ソースはコチラで公開中)

ファイルバックアップ・世代管理スクリプト。

参考サイト

ERRORLEVELについてのメモ (1) – とあるソフトウェア開発者のブログ

Windows TIPS:バッチ・ファイル中で日付をファイル名に使用する – @IT

@IT:Windows TIPS — Tips:dirコマンドでファイル名の一覧を取得する

基礎解説 演習方式で身につけるチェック式WSH超入門:第9回 VBScriptのオブジェクトを使いこなす (2/4) – @IT

コマンドラインにエラーコードを返すには-WSH@Workshop

プログラミング
えふめん

大阪在住、30代。
業務系SE・社内SEの仕事を通じて学んだこと、PCトラブルで困って調べたこと、手作業を効率化して改善したこと、WordPressのブログ運営などの記事を書いています。

えふめんをフォローする
\よかったらシェアしてね/
この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
俺の開発研究所

コメント

タイトルとURLをコピーしました