Raidやメーカー製バックアップツールもいいのですが、
予算の都合やユーザ都合で
なるべくシンプルなバックアップを組まないといけない事、ありますよね。
そんなときおすすめなのが
タスクスケジューラ&バッチ処理。
バッチ部分はvbs+cmdで実装します。
Microsoftはcmdを廃止してPowerShellに移行したいようですが
現場によってはbatやvbsのが人口が多いなどの
政治的理由でまだまだPowerShellは使いにくかったりするのです。。。
今回の要件としては
・6世代分バックアップをとりたい(月曜~土曜)
・バックアップを実行するたびにバックアップ格納先を変更する
(3台のディスクをローテーションさせる想定)
・エラーが発生したら管理者にメールを送る
を想定し実装します。
実装の流れとしては
1.bat作成
2.メール送信用vbs作成
3.bat呼び出し用vbs作成
4.タスクスケジューラ設定
となります。
順にざっくり解説します。
1.bat作成
まずはbat。詳細な説明は省略しますが
フラグ管理用のファイルを作成することで
ローテーション処理を実装しています。
このサンプルではBACKUPDESTDIR~に同じディスクを指定していますが
ここを編集することで異なるディスクにバックアップ先を変更できます。
DailyBackup.bat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
@echo off setlocal enabledelayedexpansion REM *--------------------------共通設定-------------------------------* REM バックアップ元フォルダ SET SRCDIR=C:\temp\src\ REM バックアップ先フォルダ。日ごとに1,2,3,1,2・・と順番に使用される SET BACKUPDESTDIR1=C:\temp\backup1\daily SET BACKUPDESTDIR2=C:\temp\backup2\daily SET BACKUPDESTDIR3=C:\temp\backup3\daily REM フラグファイル配置フォルダ SET FLGDIR=C:\temp\flgDir REM バックアップログ出力先フォルダ・ログファイル SET LOGDIR=C:\temp\log SET LOGFILENAME=DailyBackup.log SET COPYLOGFILENAME=DailyBackupCopyLog.log REM 1つのバックアップ先フォルダあたりに保存する世代数を指定。 SET SEDAINUM=2 REM *---------------------------メール設定--------------------------------* SET MAIL_TO="sample@hoge.co.jp" SET MAIL_CC="sample@fuga.co.jp" REM ******************************************************************* REM *以下処理実装部 * REM ******************************************************************* REM YYYYMMDD形式で日付を取得 SET TODAY=%date:~0,4%%date:~5,2%%date:~8,2% SET LOGFILE=%LOGDIR%\%LOGFILENAME% SET COPYLOGFILE=%LOGDIR%\%COPYLOGFILENAME% SET ERRORFILE=%FLGDIR%\ErrorFile SET LOGTEMPFILE=%FLGDIR%\LogTemp SET COPYLOGTEMPFILE=%FLGDIR%\CopyLogTemp REM ディレクトリ生成 IF NOT EXIST "%BACKUPDESTDIR1%" ( MKDIR "%BACKUPDESTDIR1%" ) IF NOT EXIST "%BACKUPDESTDIR2%" ( MKDIR "%BACKUPDESTDIR2%" ) IF NOT EXIST "%BACKUPDESTDIR3%" ( MKDIR "%BACKUPDESTDIR3%" ) IF NOT EXIST "%FLGDIR%" ( MKDIR "%FLGDIR%" ) IF NOT EXIST "%LOGDIR%" ( MKDIR "%LOGDIR%" ) REM バックアップ先を決定。ローテーションするようにフラグファイルを作成・削除する IF EXIST %FLGDIR%\NextBACKUPDESTDIR_1 ( SET BACKUPDESTDIR=%BACKUPDESTDIR1% DEL %FLGDIR%\NextBACKUPDESTDIR_1 echo NextBACKUPDESTDIR_2 > %FLGDIR%\NextBACKUPDESTDIR_2 ) ELSE IF EXIST %FLGDIR%\NextBACKUPDESTDIR_2 ( SET BACKUPDESTDIR=%BACKUPDESTDIR2% DEL %FLGDIR%\NextBACKUPDESTDIR_2 echo NextBACKUPDESTDIR_3 > %FLGDIR%\NextBACKUPDESTDIR_3 ) ELSE IF EXIST %FLGDIR%\NextBACKUPDESTDIR_3 ( SET BACKUPDESTDIR=%BACKUPDESTDIR3% DEL %FLGDIR%\NextBACKUPDESTDIR_3 echo NextBACKUPDESTDIR_1 > %FLGDIR%\NextBACKUPDESTDIR_1 ) ELSE ( SET BACKUPDESTDIR=%BACKUPDESTDIR1% echo NextBACKUPDESTDIR_2 > %FLGDIR%\NextBACKUPDESTDIR_2 ) REM バックアップ格納先ディレクトリ生成 SET DSTDIR=%BACKUPDESTDIR%\%TODAY% IF NOT EXIST "%DSTDIR%" ( MKDIR "%DSTDIR%" ) REM エラーファイル削除 IF EXIST "%ERRORFILE%" ( DEL %ERRORFILE% ) echo ******************************************************************* >> %COPYLOGTEMPFILE% echo *ファイルバックアップ開始 * >> %COPYLOGTEMPFILE% echo ******************************************************************* >> %COPYLOGTEMPFILE% echo 【開始時刻】 >> %COPYLOGTEMPFILE% date /t >> %COPYLOGTEMPFILE% time /t >> %COPYLOGTEMPFILE% SET FILEDSTDIR=%DSTDIR%\NAS IF NOT EXIST "%FILEDSTDIR%" ( MKDIR "%FILEDSTDIR%" ) ROBOCOPY %SRCDIR% %FILEDSTDIR% /COPYALL /DCOPY:DAT /NFL /NP /E /R:0 >> %COPYLOGTEMPFILE% if NOT %ERRORLEVEL%==1 ( REM エラー時メール送信 echo File Copy Error >> %ERRORFILE% echo ErrorLevel:%ERRORLEVEL% >> %ERRORFILE% TYPE %COPYLOGTEMPFILE% >> %ERRORFILE% echo\ %ERRORFILE% ) TYPE %COPYLOGTEMPFILE% >> %LOGTEMPFILE% DEL /Q %COPYLOGTEMPFILE% echo\ >> %LOGTEMPFILE% echo ******************************************************************* >> %LOGTEMPFILE% echo *古い世代のフォルダを削除 * >> %LOGTEMPFILE% echo ******************************************************************* >> %LOGTEMPFILE% echo 【開始時刻】 >> %LOGTEMPFILE% date /t >> %LOGTEMPFILE% time /t >> %LOGTEMPFILE% REM フォルダ数がSEDAINUM以上存在する場合最も古いディレクトリを削除 SET DIRNUM= FOR /F "usebackq" %%t IN (`DIR /AD /B "%BACKUPDESTDIR%" ^| FIND /C /V ""`) DO SET DIRNUM=%%t echo DIRNUM=%DIRNUM% >> %LOGTEMPFILE% echo SEDAINUM=%SEDAINUM% >> %LOGTEMPFILE% IF %DIRNUM% GTR %SEDAINUM% ( SET OLDER= FOR /F "usebackq" %%a IN (`DIR /AD /O-N /B "%BACKUPDESTDIR%"`) DO SET OLDER=%%a echo %BACKUPDESTDIR%\!OLDER! IF EXIST %BACKUPDESTDIR%\!OLDER! ( RMDIR /S /Q %BACKUPDESTDIR%\!OLDER! >> %LOGTEMPFILE% echo Old backup directory Deleted:%BACKUPDESTDIR%\!OLDER! >> %LOGTEMPFILE% ) ) echo\ >> %LOGTEMPFILE% echo ******************************************************************* >> %LOGTEMPFILE% echo *結果を管理者にメール送付 * >> %LOGTEMPFILE% echo ******************************************************************* >> %LOGTEMPFILE% REM %LOGTEMPFILE%の中身を送付 echo %MAIL_TO% %MAIL_CC% にメール送信します >> %LOGTEMPFILE% cscript SendMail.vbs %MAIL_TO% %MAIL_CC% バックアップログ %LOGTEMPFILE% echo\ >> %LOGTEMPFILE% echo ******************************************************************* >> %LOGTEMPFILE% echo *ERRORがあれば管理者にメール送付 * >> %LOGTEMPFILE% echo ******************************************************************* >> %LOGTEMPFILE% REM %ERRORFILE%の中身を送付 IF EXIST %ERRORFILE% ( cscript SendMail.vbs %MAIL_TO% %MAIL_CC% バックアップ:★エラー★ %ERRORFILE% ) ELSE ( echo No Error. >> %LOGTEMPFILE% ) echo\ >> %LOGTEMPFILE% REM ログに区切りとして空行を出力 echo ............................................................bat Finished. >> %LOGTEMPFILE% echo\ >> %LOGTEMPFILE% echo\ >> %LOGTEMPFILE% echo\ >> %LOGTEMPFILE% REM ログをファイルに出力 TYPE %LOGTEMPFILE% >> %LOGFILE% DEL /Q %LOGTEMPFILE% ENDLOCAL exit /b 0 |
2.メール送信用vbs作成
次にメール送信用vbs作成。
DailyBackup.batから引数をセットして呼ぶようにしています。
SendMail.vbs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
Set objMail = CreateObject("CDO.Message") '------------------------------------------------------------------------------- '----メール内容組み立て---- '------------------------------------------------------------------------------- Set oParam = WScript.Arguments 'oParam(0)'メール送信先。カンマ区切りで複数指定可能 'oParam(1)'メール送信先(CC)。カンマ区切りで複数指定可能 'oParam(2)'件名 'oParam(3)'本文 'oParam(4)'添付ファイル※任意 objMail.From = "from@mailServer.co.jp" objMail.To = oParam(0) objMail.Cc = oParam(1) objMail.Subject = oParam(2) '本文処理 Dim oBody,oFso Set oFso = CreateObject("Scripting.FileSystemObject") Set oBody = oFso.GetFile(oParam(3)).OpenAsTextStream objMail.TextBody = oBody.ReadAll oBody.close Set oFso = Nothing objMail.TextBodyPart.Charset = "ISO-2022-JP" 'objMail.TextBody = "CDO.Messageによるメール送信テスト" '添付ファイル(ファイルパスを指定) If oParam.Count = 5 Then objMail.AddAttachment = oParam(4) End If '------------------------------------------------------------------------------- '----メール送信処理---- '------------------------------------------------------------------------------- objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mailServer.co.jp" objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "username" objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password" objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30 objMail.Configuration.Fields.Update objMail.Send Set objMail = Nothing |
3.bat呼び出し用vbs作成
こちらは単にDailyBackup.batを
バックグラウンドで呼ぶだけです。batを直接呼ぶと、
コマンドプロンプトが表示されてしまいます。
タスクスケジューラからbatを実行すると、結果として
いきなりコマンドプロンプトが表示される形となってしまいます。
ユーザを困惑させてしまいますので、ここではvbsからbatを呼び出しています。
DailyBatStart.vbs
1 2 3 4 |
Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c DailyBackup.bat NORMAL", vbhide, true |
4.タスクスケジューラ設定
最後にタスクスケジューラ。
タスクスケジューラから
「タスクの作成」を選択し
下図のようにタスクを設定してください。
※DailyBatStart.vbsを実行させたいのですが
直接vbsを起動できないので
wscriptに引数として渡す形で起動する必要があります。
以上でバックアップ環境構築完了です。