Windowsコマンドラインからスタンバイ・ハイバネートする小物を書いたのでメモ。
(追記2008/10/17:アップデートしたのでそちらをどうぞd:id:naga_sawa:20081017:1224211487)
バイナリがいる方は↓に置いています。
ソースは後ろの方。
使い方
> neochi [s|h]
- s スタンバイ
- h 休止状態
実行したら即座に指定された電源状態になります。待機時間はないので注意してください。また、管理者(Administrator)権限が必要かもしれません。
作ったわけとか
自宅サーバやっている人の中には電気代や帰宅後の室温を気にして、常時起動ではなく用事のある都度 WoL でサーバを起こしている人もいると思います。
用事が済んだ後は再び落としたいところですが、あいにく GUI からそれをやる方法は発見できず、コマンドラインからやるにしても、shutdown コマンドでは電源OFF状態になるので、環境によっては再 WoL できなくなってしまいます。
スタンバイ状態にしておくのが無難なわけですが、「コマンドライン スタンバイ」などでググると、大抵
コマンドラインで C:\>%windir%\System32\rundll32.exe powrprof.dll,SetSuspendState
とあるけれど、この方法だと休止状態(ハイバーネーション)になってしまうので、次回起動に時間がかかってしまう、休止状態にできない環境で(たぶん)使えない、という問題があります。
(根も葉もない理由は「BHR-4RV で外から WoL できる環境を作って自宅PCを起こせるようになったはいいものの、寝かせ方がなかったorz」です)
なので、車輪の再発明な気がしないでもないけど作ってみました。
コマンドラインから叩くので、バッチファイルにも仕込めます。
エンコードバッチの最後に仕込んでおけば夜間エンコードの後にスタンバイにできるので節電できます。エコです(笑
開発環境 : VisualStudio2008
C++版
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include <powrprof.h> #pragma comment(lib, "powrprof") void printUsage() { wprintf(L"Give a option : [s|h]\n"); wprintf(L" s : Standby\n"); wprintf(L" h : Hibernate\n"); } int _tmain(int argc, _TCHAR* argv[]) { if (argc < 2) { printUsage(); return 0; } if (argv[1][0] == 's') { // スタンバイ SetSuspendState(0, 0, 0); } else if (argv[1][0] == 'h') { // ハイバネート(休止状態) SetSuspendState(1, 0, 0); } else { printUsage(); } }
C#版
using System; using System.Windows.Forms; namespace NeochiCS { class Entry { static void Main(string[] args) { if (args.Length < 1) { PrintUsage(); return; } if (args[0].ToLower() == "s") { // スタンバイ Application.SetSuspendState(PowerState.Suspend, false, false); } else if (args[0].ToLower() == "h") { // ハイバネート(休止状態) Application.SetSuspendState(PowerState.Hibernate, false, false); } else { PrintUsage(); } } static void PrintUsage() { Console.WriteLine("Give a option : [s|h]"); Console.WriteLine(" s : Standby"); Console.WriteLine(" h : Hibernate"); } } }