インフラエンジニアも人間じゃない?

インフラエンジニアの備忘録

アイドル時に電源オプションを自動で省電力に変更する

最近暑くなって来たので電力制限フル開放の9900Kを使っていると部屋が熱くなります。

アイドル時でも発熱しすぎ


ということで起動してるけど特に使ってない時は省電力モードに、使ってる時は高パフォーマンスにしたいと思いました。
思いつく限りそんなオプションはデフォでなかった気がするのでスクリプトを組むことに。

1.次の3つのファイルを適当なディレクトリに置く。

toast.ps1

Function Toast {
    $AppId = "{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe"
    $null = [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime]
    $null = [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime]
    $xml = New-Object Windows.Data.Xml.Dom.XmlDocument
    $xml.LoadXml($template)
    [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($AppId).Show($xml)
}

$args0 = $Args[0]
$args1 = $Args[1]

$template = @"
<toast duration="$args0">
    <visual>
        <binding template="ToastText02">
            <text id="2">$args1</text>
        </binding>
    </visual>
</toast>
"@

Toast
exit


powercfg_performance.bat

@echo off

:main
timeout 3
del %~dp0powercfg.lck
if not exist %~dp0powercfg.lck (
	powercfg -setactive SCHEME_MIN
	powershell %~dp0toast.ps1 short 電源オプションを高パフォーマンスに変更しました
	exit
)
goto main


powercfg_powersave.bat

@echo off

powercfg -setactive SCHEME_MAX
cd %~dp0
start /min cmd /c powercfg_performance.bat
powershell %~dp0toast.ps1 short 電源オプションを省電力に変更しました

pause 3>>"%~dp0powercfg.lck"


2.タスクスケジューラでタスクを作成

ポイントはこのあたり
・ユーザがログオンしているかどうかにかかわらず実行する
 これにしないと実行時にPowershellとかいろいろでてきて邪魔です
・次の間アイドル状態の場合のみタスクを開始する
 1分にすると1分間マウス操作とかCPU負荷がなければアイドルと判定されるらしいです
・コンピュータがアイドル状態でなくなった場合は停止する
 これ有効にしないと省電力から永久に復帰してくれません


3.結果
1分ぐらい操作しないと電源オプションが省電力に切り替わります。
操作すると高パフォーマンスに戻ります。
ついでに通知もでます。

電源オプションでCPU周波数は好きにいじれるので変えたかったら適当に変えてくれ。

参考
PowerShellでトースト通知やバルーンチップを扱う - 俺の外付けHDD
GPD Pocket : “超”省電力設定 – しかるのち



補足

  1. タスクスケジューラでアイドル判定になるとpowercfg_powersave.batが呼ばれる
  2. powercfg -setactive SCHEME_MAX で電源オプションを変更
  3. powercfg_performance.batを別窓で呼ぶ
  4. pause 3>>"%~dp0powercfg.lck" で同ディレクトリに powercfg.lck を作成し、共有ロックしたまま書き込めないようにする
  5. powercfg_performance.bat は powercfg.lck を削除できるまで(共有ロックが解除されるまで)無限ループ
  6. タスクスケジューラでアイドル状態が解除されるとpowercfg_powersave.batが強制停止される
  7. powercfg.lck が削除可能になり、powercfg_performance.batの処理が実行される
  8. powercfg -setactive SCHEME_MIN で電源オプションが高パフォーマンスに戻る
  9. 終わり

フラグファイルは気に入らないけどそこそこ簡単にできたのでまあいいんじゃないか