コマンドラインからスタンバイ・ハイバネートする

Windowsコマンドラインからスタンバイ・ハイバネートする小物を書いたのでメモ。

(追記2008/10/17:アップデートしたのでそちらをどうぞd:id:naga_sawa:20081017:1224211487)

バイナリがいる方は↓に置いています。

  • C++版 [Download(discon)]
  • C#版 [Download(discon)]

ソースは後ろの方。

使い方
> 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");
        }
    }
}