2013年11月19日火曜日

Windows storage server 2008r2 robocopy メール通知

LogitecのWSS NASで、robocopyした際にメール通知がしたくて、いろいろやった結果。

このサイトを参考にさせていただき、コマンドでのメール送信を確認。

こんな感じになりました。
---------------------------------------------------------------------------------------------------

// メール送信モジュール
//
//   cscript //nologo send_mail.js '件名''本文'
// 引数を取得
var mail_subject = '件名';
var mail_body    = '本文';
// 設定項目
var from_mail_address = 'メアド';
var to_mail_addresses = 'メアド;
var smtp_server_name  = 'smtp-server';

// -------- ローカルマシンでのコマンドの実行結果を取得する関数 --------

var ws = WScript.CreateObject('WScript.Shell');
// コマンド実行結果を行ごとに配列として取得
function cmd_output_arr( str_cmd )
{
 // コマンド実行
 var proc = ws.Exec("cmd /c " + str_cmd );

 // 終了まで待つ
 while( proc.Status == 0 )
 {
  WScript.Sleep(100);
 }

 // 出力を取得
 var str_out = proc.StdOut.ReadAll();

 // 末尾の空行を削除
 var arr = str_out.split('\r\n');
 arr.pop();

 return arr;
}
// コマンド実行結果を文字列として取得
function cmd_output( str_cmd )
{
 return cmd_output_arr( str_cmd ).join('\r\n');
}

// -------- メイン処理 --------

var mail = WScript.CreateObject('CDO.Message');
var schemas = 'http://schemas.microsoft.com/cdo/configuration/';
// メール内容に関する設定

mail.From     = from_mail_address;
mail.To       = to_mail_addresses;
mail.Subject  = mail_subject;
mail.TextBody = mail_body + '\r\n\r\n'
 + '日時:'     + cmd_output( '@echo %DATE% %TIME%' )  + '\r\n'
 + 'マシン名:' + cmd_output( '@hostname' )            + '\r\n'
 + cmd_output( '@ipconfig | findstr /C:"IPv4 アドレス"' ) + '\r\n'
;
mail.AddAttachment('c:\\robocopylog.txt');
mail.TextBodyPart.Charset = 'ISO-2022-JP';

// メール送信に関する設定(XP Proなら不要)
mail.Configuration.Fields.Item( schemas + 'sendusing' ) = 2;
mail.Configuration.Fields.Item( schemas + 'smtpconnectiontimeout' ) = 30;
mail.Configuration.Fields.Item( schemas + 'smtpserver' ) = smtp_server_name;
mail.Configuration.Fields.Item( schemas + 'smtpserverport' ) = 587;
mail.Configuration.Fields.Item( schemas + 'smtpauthenticate') = true;
mail.Configuration.Fields.Item( schemas + 'sendusername') = 'user';
mail.Configuration.Fields.Item (schemas + 'sendpassword') = 'password';
mail.Configuration.Fields.Update();
// 送信
mail.Send();

---------------------------------------------------------------------------------------------------------

最初のほうの件名のところのArgumentsがどうしてもエラーになってしまうので、変更。

後は、適当に当てはめてみた。


バッチファイルは、ただの robocopyなので簡単かと思いきや、実際にWSSのNASに
設定してみたらはまった。

手動でバッチファイルを走らせると、バックアップもメールもOK。

タスクスケジューラーに登録して、ログオフして待っていると、1回目はOKなのに、
2回目はバッチが走らない。

なぜか、考えること数時間、、、、、

バッチファイルの末尾に exit を入れないと、次回以降のバッチが走らない。
"インスタンスが実行中"とか何とかメッセージが出ていて、終了しても実行中のまま
終わらない。削除してもだめ。

cmd.exe が残ってしまい関係各所をロックしてしまうようだ。
再起動するしかなかった。

最終的に書いたバッチは、

--------------------------------------------------------------------------------------------------------

echo off
echo データをバックアップ


robocopy "C:\test"   "D:\test" /mir >>C:\\robocopylog.txt

cscript //nologo send_mail.js

exit

---------------------------------------------------------------------------------------------------------

バッチのログをメールで送るだけ。
あと、これも重要なようで、

"タスクスケジューラの【操作の編集】の 【開始(オプション)(T)】に、batが存在しているフォルダを入力する。"

NASのバックアップ機能は、メール通知ができなかった。
状態やエラー通知は出来るので、バックアップはこっちで、その他は本体の機能で
設定。