指定した時刻にパソコンを落とすスクリプト

 指定した時刻にパソコンの電源を落とすスクリプトです。JScriptなんか久しぶりに書いた。そろそろ仕事も始まりそうなので、気持ち丁寧に書きました。

// shutdownAt.js
// 指定した時刻にパソコンの電源を落とす。
// 使用方法:
//    cscript shutdownAt.js 8:30

// date1とdate2の間隔を、秒を単位として返す。
function getSecsDiff(date1, date2) {
    var diffInMillisecs = 0;
    if(date1 < date2) {
	diffInMillisecs = date2 - date1;
    } else {
	diffInMillisecs = date1 - date2;
    }
    return Math.floor(diffInMillisecs / 1000);
}

// パラメータdateと、現在時刻を比較する。
// dateが過去を表わしている時、trueを返し、
// 現在〜未来を表わしているとき、falseを返す。
function isPast(date) {
    return date < new Date();
}

// コマンドライン引数から、Dateオブジェクトを作る。
// このメソッドでは値の検証はしない。事前にチェックが必要。
function parseArgs() {
    var regex = /([0-9]{1,2}):([0-9]{1,2})/;
    var param = WScript.Arguments.Item(0);
    var result = regex.exec(param);
    var hour = parseInt(result[1]);
    var minute = parseInt(result[2]);
    var ret = new Date();
    ret.setHours(hour);
    ret.setMinutes(minute);
    return ret;
}

// コマンドライン引数の検証をする。
// 妥当であればtrueを返し、そうでなければfalseを返す。
function validateArgs() {
    var args = WScript.Arguments;
    // パラメータの個数を検証
    if(1 !== args.length) {
	return false;
    }
    // パラメータのフォーマットを検証
    var regex = /([0-9]{1,2}):([0-9]{1,2})/;
    if(!regex.test(args.Item(0))) {
	return false;
    }
    var matched = regex.exec(args.Item(0));

    // 時刻の値の範囲を検証
    var hour = parseInt(matched[1]);
    if(hour < 0 || 23 < hour) {
	return false;
    }

    // 分の値の範囲を検証
    var minutes = parseInt(matched[2]);
    if(minutes < 0 || 59 < minutes) {
	return false;
    }
    return true;
}

// メインメソッド。
function main() {
    if(!validateArgs()) {
	WScript.Echo("usage(ex): cscript shutdownAt.js 8:30");
    }

    var shutdownAt = parseArgs();
    if(isPast(shutdownAt)) {
	// 翌日を設定する。2010-12-32は、2011-1-1となることを確認済み。
	shutdownAt.setDate(shutdownAt.getDate() + 1);
    }
    var diffSecs = getSecsDiff(new Date(), shutdownAt);
    WScript.CreateObject("WScript.Shell").Exec("shutdown -s -t " + diffSecs); 
}

main();