PT2 (TvRock + RecTest) で録画中でないことを確認し、スリープモードへ移行するバッチ


TvRock のスリープタイマーやタイマーを使ってPCを停止することを習慣づけることにより、録画中に誤ってPCを停止してしまうことを防ぐことができます。
そのため、このRubyスクリプトはあまり役に立たないかもしれませんが、録画中でない場合にすぐにスリープモードへ移行したい時に役に立つかもしれません…

主にサンプルコードとして役立てていただけたらうれしいです。

機能

  1. RecTestで録画中だった場合、スリープへの移行を中止します。
  2. 次の予約録画開始が10分以内だった場合、スリープへの移行を中止します。
  3. 次の録画予約の前にWakeupのタスクがスケジュールされていなかったら、スリープへの移行を中止します。
  4. 上記のチェックをパスした場合、スリープモードへ移行します。

ダウンロード

Ruby 2.0 で動作確認済みです。

Rubyスクリプトを実行するにはあらかじめRubyをインストールしておく必要があります。
http://rubyinstaller.org/

不具合などありましたら、コメント欄からご連絡ください。

処理フロー

  1. 実行中のプロセス一覧を取得する。 require 'win32ole' def get_process_list locator = WIN32OLE.new("WbemScripting.SWbemLocator") services = locator.ConnectServer(".", "root/cimv2") # http://msdn.microsoft.com/en-us/library/aa394372(v=vs.85).aspx procset = services.ExecQuery("Select Caption From Win32_Process") procset.extend Enumerable return procset.map {|proc| proc.Caption}.sort.uniq end
  2. RecTest.exe が実行中だったらスリープへの移行を中止する。
  3. レジストリからTvRockの設定フォルダのパスを取得する。 # -*- coding: SJIS -*- require 'win32/registry' def get_tvrock_conf_dir # http://www.ruby-lang.org/ja/man/html/win32_registry.html begin Win32::Registry::HKEY_CURRENT_USER.open('software\\TvRock') do |reg| return reg['DOCUMENT'] end rescue Win32::Registry::Error popup("レジストリから TvRock の設定フォルダのパスを取得できませんでした。", 16) exit end end
  4. 上で取得したフォルダから録画予約のスケジュール一覧を取得する。
  5. 次の録画開始が10分以内だったらスリープへの移行を中止する。
  6. タスクスケジューラからタスク一覧を取得する。 now = Time.now.to_i # http://support.microsoft.com/kb/814596/ja # TvRockのWakeupタスク一覧を取得 wakeup_tasks_dtm = [] `schtasks /query /fo csv`.each_line do |task| next unless %r|^"\\TvRock wakeup \(\d+\)","(\d{4})/(\d{2})/(\d{2}) (\d{1,2}):(\d{2}):(\d{2})"| =~ task time = Time.local($1, $2, $3, $4, $5, $6).to_i wakeup_tasks_dtm.push(time) if now < time end Rubyスクリプトの拡張子を rbw として実行したところ、バッククォートで実行したコマンドの出力を取得できませんでした。
  7. 次の録画予約の前にWakeUpのタスクが登録されていなかったらスリープへの移行を中止する。
  8. 上記のチェックをパスしたら、スリープモードへ移行する。 # -*- coding: SJIS -*- require 'Win32API' def suspend # http://msdn.microsoft.com/en-us/library/aa373201(v=vs.85).aspx setSuspendState = Win32API.new('powrprof.dll', 'SetSuspendState', %w(i i i), 'i') if 0 == setSuspendState.call(0, 0, 0) popup("スリープモードへの移行に失敗しました。", 16) exit end end

処理中にエラーが発生した場合などはポップアップウィンドウで通知する。 require 'win32ole'

実行ファイルのフルパス

EXEFILE = (defined?($Exerb) ? ExerbRuntime.filepath : FILE)

def popup(message, type = 48) timeout = 0 title = File::basename(EXEFILE)

# http://msdn.microsoft.com/ja-jp/library/cc364428.aspx
wsh = WIN32OLE.new('WScript.Shell')
wsh.Popup(message, timeout, title, type)

end

カテゴリー: 記事 タグ: , , , , , パーマリンク

9 Responses to PT2 (TvRock + RecTest) で録画中でないことを確認し、スリープモードへ移行するバッチ

  1. homewindow のコメント:

    はじめまして管理人様。プログラミングはさっぱりわかりませんが、どうにか予約直前や録画中に手動でスリープにしてしまう事故を防ぐことができるようになりました。ありがとうございました。

  2. NORI のコメント:

    役立てていただけたようでうれしいです。 私のお勧めの方法は 「TvRock のスリープタイマーやタイマーを使ってPCを停止することを習慣づける」 ことです。

    そのために、こちらの記事も参考にしてみてください。 http://tipszone.jp/20110428_pt2/#sleep-mode

  3. れんと のコメント:

    はじめまして。 便利なスクリプトをありがとうございます。 一点、問題を修正しましたので、お知らせします。

    問題は、「無効」になっている録画予約を無視してくれないことです。 そこで、get_next_rec_startのループの中心部分を以下のように修正しました。

    if schedule[0]['VALIDATE'].to_i > 0 ### 追加
        if now <= schedule[0]['END'].to_i
            if schedule[0]['START'].to_i <= now
                popup("現在録画予定の番組が放送中です。n休止モードへの移行を中止します。")
                exit
            end

            break
        end
    end ### 追加

    私、Rubyは全然使っていないので、もっと適切な修正方法があるかも知れません。 ご参考まで。

  4. NORI のコメント:

    れんとさん
    コメントありがとうございます。

    すみません。今コメントに気づきました。
    確認いたします。

  5. NORI のコメント:

    れんとさんのご指摘の通り修正し、期待通りに動くことを確認できました。
    また、Ruby 2.0 向けの修正なども行いました。
    ご指摘ありがとうございました。

  6. taguhiro のコメント:

    NORIさん バッチ使わせていただいております。ありがとうございます。 質問があります。

    次の録画予約の前にWakeUpのタスクが登録されていなかったら・・・ という状況がTvRockの運用上発生するのでしょうか?

    また最後の

    5分以内にwakeupのタスクがスケジュールされていた場合スリープへ移行中止 これもどのような状況で発生しますでしょうか?

    どうぞよろしくお願いいたします。

  7. NORI のコメント:

    次の録画予約の前にWakeUpのタスクが登録されていなかったら・・・という状況がTvRockの運用上発生するのでしょうか?

    TvRock の詳しい仕様を把握していないため、よくわかりません。
    もしかすると無いかもしれません。

    5分以内にwakeupのタスクがスケジュールされていた場合スリープへ移行中止 これもどのような状況で発生しますでしょうか?

    これは数分後に録画が開始されるケースです。
    この場合スリープへ移行しても5分以内にスリープから自動復帰するので、それであればスリープにしない方が省エネだと思い、その様にしました。
    また、数秒~数十秒後に WakeUp のタスクがある場合にスリープへの移行を開始すると、そのタスクが実行されず、録画に失敗する恐れがあると考えました。

  8. taguhiro のコメント:

    NORIさん ご返事ありがとうございます。

    うちの環境はXPSP3ですが「TvRockのWakeupタスク一覧を取得」の部分が動作しなかったので コメントアウトして 使わせて頂いております。

    TvRockの動きを見る限り タスクが登録されないようなことはない のと 5分以内にwakeupタスクが登録されている場合というのは、「10分以内に録画予定の番組が始まり・・」の処理で対応できているのではと思っております。

    このバッチを使って 屋根裏にあるサーバーを夜間は眠らせることに成功しました。 ありがとうございました!!

  9. NORI のコメント:

    5分以内にwakeupタスクが登録されている場合というのは、「10分以内に録画予定の番組が始まり・・」の処理で対応できているのではと思っております。

    確かにそうですね。

    このバッチを使って 屋根裏にあるサーバーを夜間は眠らせることに成功しました。 ありがとうございました!!

    それは良かった! TvRock のスリープタイマー (スタンバイ) を使えば、このスクリプトは使わなくても実現できるかもしれませんよ。

コメントを残す