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のバックアップ機能は、メール通知ができなかった。
状態やエラー通知は出来るので、バックアップはこっちで、その他は本体の機能で
設定。
>>最初のほうの件名のところのArgumentsがどうしてもエラーになってしまうので
返信削除どう変更され解決されたのですか?
参考にさせていただいた元サイトの
削除// 引数を取得
var mail_subject = WScript.Arguments.Unnamed(0);
var mail_body = WScript.Arguments.Unnamed(1);
この部分を
// 引数を取得
var mail_subject = 'hogehoge';
var mail_body = 'hogehoge';
というようにしました。
元のコードがエラーするというよりは、
私がうまく扱えなかったということです。