TvRock のスリープタイマーやタイマーを使ってPCを停止することを習慣づけることにより、録画中に誤ってPCを停止してしまうことを防ぐことができます。
そのため、このRubyスクリプトはあまり役に立たないかもしれませんが、録画中でない場合にすぐにスリープモードへ移行したい時に役に立つかもしれません…
主にサンプルコードとして役立てていただけたらうれしいです。
機能
- RecTestで録画中だった場合、スリープへの移行を中止します。
- 次の予約録画開始が10分以内だった場合、スリープへの移行を中止します。
- 次の録画予約の前にWakeupのタスクがスケジュールされていなかったら、スリープへの移行を中止します。
- 上記のチェックをパスした場合、スリープモードへ移行します。
ダウンロード
※Ruby 2.0 で動作確認済みです。
Rubyスクリプトを実行するにはあらかじめRubyをインストールしておく必要があります。
http://rubyinstaller.org/
不具合などありましたら、コメント欄からご連絡ください。
処理フロー
- 実行中のプロセス一覧を取得する。
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
- RecTest.exe が実行中だったらスリープへの移行を中止する。
- レジストリから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
- 上で取得したフォルダから録画予約のスケジュール一覧を取得する。
- 次の録画開始が10分以内だったらスリープへの移行を中止する。
- タスクスケジューラからタスク一覧を取得する。
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 として実行したところ、バッククォートで実行したコマンドの出力を取得できませんでした。 - 次の録画予約の前にWakeUpのタスクが登録されていなかったらスリープへの移行を中止する。
- 上記のチェックをパスしたら、スリープモードへ移行する。
# -*- 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
はじめまして管理人様。プログラミングはさっぱりわかりませんが、どうにか予約直前や録画中に手動でスリープにしてしまう事故を防ぐことができるようになりました。ありがとうございました。
役立てていただけたようでうれしいです。 私のお勧めの方法は 「TvRock のスリープタイマーやタイマーを使ってPCを停止することを習慣づける」 ことです。
そのために、こちらの記事も参考にしてみてください。 http://tipszone.jp/20110428_pt2/#sleep-mode
はじめまして。 便利なスクリプトをありがとうございます。 一点、問題を修正しましたので、お知らせします。
問題は、「無効」になっている録画予約を無視してくれないことです。 そこで、get_next_rec_startのループの中心部分を以下のように修正しました。
if now <= schedule[0]['END'].to_i
if schedule[0]['START'].to_i <= now
popup("現在録画予定の番組が放送中です。n休止モードへの移行を中止します。")
exit
end
break
end
end ### 追加
私、Rubyは全然使っていないので、もっと適切な修正方法があるかも知れません。 ご参考まで。
れんとさん
コメントありがとうございます。
すみません。今コメントに気づきました。
確認いたします。
れんとさんのご指摘の通り修正し、期待通りに動くことを確認できました。
また、Ruby 2.0 向けの修正なども行いました。
ご指摘ありがとうございました。
NORIさん バッチ使わせていただいております。ありがとうございます。 質問があります。
また最後の
どうぞよろしくお願いいたします。
TvRock の詳しい仕様を把握していないため、よくわかりません。
もしかすると無いかもしれません。
これは数分後に録画が開始されるケースです。
この場合スリープへ移行しても5分以内にスリープから自動復帰するので、それであればスリープにしない方が省エネだと思い、その様にしました。
また、数秒~数十秒後に WakeUp のタスクがある場合にスリープへの移行を開始すると、そのタスクが実行されず、録画に失敗する恐れがあると考えました。
NORIさん ご返事ありがとうございます。
うちの環境はXPSP3ですが「TvRockのWakeupタスク一覧を取得」の部分が動作しなかったので コメントアウトして 使わせて頂いております。
TvRockの動きを見る限り タスクが登録されないようなことはない のと 5分以内にwakeupタスクが登録されている場合というのは、「10分以内に録画予定の番組が始まり・・」の処理で対応できているのではと思っております。
このバッチを使って 屋根裏にあるサーバーを夜間は眠らせることに成功しました。 ありがとうございました!!
確かにそうですね。
それは良かった! TvRock のスリープタイマー (スタンバイ) を使えば、このスクリプトは使わなくても実現できるかもしれませんよ。