ブログに戻る
Guide

PowerShellでWindows PCをスリープさせない:試した2つのスクリプト

管理者権限なしで、PowerShellからWindowsをスリープさせない方法。SetThreadExecutionStateでスリープと画面オフを止めるか、1分ごとにF15を押してアイドルタイマーをリセットします。実行と停止の方法、powercfgの1行、TeamsとSlackへの効果。

Slack Green Team
September 29, 2026
October 9, 2026
6 分で読める
Share:
windows
powershell
remote work

PowerShellを使えば、管理者権限なしでWindows PCをスリープさせない方法が2つあります。すっきりしているのは、Windows APIのSetThreadExecutionStateを呼んで、システムとディスプレイが使用中だとWindowsに伝える方法です。スクリプトが動いているあいだはスリープも画面オフも止まり、入力は一切送りません。もう1つはSendKeysで1分ごとにF15キーを押す方法で、アイドルタイマーがリセットされるため、Microsoft Teamsも緑のままになります。F15のスクリプトは、Slackのデスクトップアプリもアクティブに保つはずです。アプリが同じアイドルタイマーを10秒ごとに読んでいるからです(Slackデスクトップ版4.52.178のコードで2026年10月7日に確認)。Windowsでは時間を計っていません。SetThreadExecutionStateのスクリプトは入力を送らないので、Slackは10分で離席中になります。

PC上のスクリプトでは、PCがロック中、スリープ中、電源オフのあいだSlackを緑に保てません。それができる方法はSlackをアクティブに保つ方法にまとめています。

スクリプト1:SetThreadExecutionStateでスリープを止める

動画プレーヤーが使うのと同じ仕組みで、システムとディスプレイをオンのままにするようWindowsに求めます。キーボードやマウスの入力は作りません。

# keepawake.ps1 - keeps Windows and the display awake until you press Ctrl+C
$sig = '[DllImport("kernel32.dll")] public static extern uint SetThreadExecutionState(uint esFlags);'
$power = Add-Type -MemberDefinition $sig -Name 'Power' -Namespace 'Win32' -PassThru

# ES_CONTINUOUS (0x80000000) | ES_SYSTEM_REQUIRED (0x1) | ES_DISPLAY_REQUIRED (0x2)
$null = $power::SetThreadExecutionState([uint32]2147483651)
Write-Host "Keeping this PC awake. Press Ctrl+C to stop."
try {
    while ($true) { Start-Sleep -Seconds 60 }
} finally {
    $null = $power::SetThreadExecutionState([uint32]2147483648)   # ES_CONTINUOUS: back to normal
}

動いているか確かめるには、別のPowerShellウィンドウでpowercfg /requestsを実行します。スクリプトの実行中は、DISPLAYとSYSTEMの下にPowerShellが表示されます。

スクリプト2:1分ごとにF15を押す

F15はどのキーボードにもないキーなので、ほとんどのアプリは無視しますが、Windowsは入力として数えます。

# f15.ps1 - presses F15 once a minute until you press Ctrl+C
$shell = New-Object -ComObject WScript.Shell
while ($true) {
    $shell.SendKeys('{F15}')
    Start-Sleep -Seconds 60
}

入力なので、Teamsが使うアイドルタイマーがリセットされ、Teamsはたいてい「連絡可能」のままです。キーは前面にあるウィンドウに送られます。こうしたソフトウェアの入力は、Windowsが「注入された入力」として印を付けるので、監視ツールから見えることがあります。詳しくはマウスジグラーは検出されるかをご覧ください。Num Lockを使う版や勤務時間だけ動く版など、Teams専用のスクリプトはTeamsをアクティブに保つPowerShellスクリプトにあります。ポインターを動かすジグラーをPython、AutoHotkey、5ドルほどのUSBボードで作る方法はマウスジグラーの自作に、同じ2つのスクリプトのAutoHotkey v2版はPCをスリープさせないAutoHotkeyスクリプトにあります。

スクリプトの実行と停止

  • スクリプトをメモ帳に貼り付け、keepawake.ps1として保存します。
  • PowerShellを開き(管理者権限は不要)、そのフォルダーに移動します。
  • 実行します:powershell -ExecutionPolicy Bypass -File .\keepawake.ps1
  • 止めるときはCtrl+Cを押すか、ウィンドウを閉じます。Windowsはふだんの電源設定に戻ります。

会社がPowerShellのスクリプトを禁止しているなら、ポリシーを回避しないでください。代わりに管理者権限なしで会社のPCをスリープさせない方法の設定やツールを使います。リモートデスクトップのセッション内では、F15のスクリプトはセッションのアイドルタイマーもリセットします。RDPのタイムアウトのポリシーについてはリモートデスクトップのセッションを維持する方法をご覧ください。

Slackで「離席中」と表示されなくなります

クラウドベース。ダウンロード不要。ノートPCがオフでも24時間稼働。

バッチやcmdならタイムアウトを変える

スクリプトを動かし続けずに、電源接続中のスリープを止めるには次のようにします。

powercfg /change standby-timeout-ac 0
powercfg /change monitor-timeout-ac 0

0は「なし」の意味です。あとで戻すときは、powercfg /change standby-timeout-ac 30のように分数を指定します。会社の管理下にあるPCでは、ポリシーで固定されていることがあります。ディスプレイのタイマーを秒単位で変える方法やロック画面のタイマーはWindows 11で画面のタイムアウトを変える方法にあります。

ダウンロードが終わるまでPCをスリープさせない

スリープに入るとダウンロードは止まります。Windowsがディスクを休ませてネットワークを切るので、Steamはダウンロードを一時停止と表示したままPCが起きるのを待ち、ブラウザのダウンロードはネットワークエラーで失敗することがよくあります。画面が暗くなったりロックされたりしても止まりません。PC自体は動き続けているからです。つまりダウンロードのために止める必要があるのはスリープだけで、ディスプレイは消えてかまいません。

状態ダウンロードは続くか
起動中で、画面がオフかロック中続く
スリープ、休止状態、シャットダウン止まる
ノートPCのふたを閉じた(初期設定の動作)止まる。ふたを閉じるとスリープに入る

スクリプト1からディスプレイのフラグを外し、フォルダーへの書き込みが5分間なくなったらWindowsがまたスリープできるようにしたのが次の版です。

# awake-while-downloading.ps1 - no sleep while files in the folder are still changing
param(
    [string]$Folder = "$env:USERPROFILE\Downloads",
    [int]$QuietMinutes = 5
)
$sig = '[DllImport("kernel32.dll")] public static extern uint SetThreadExecutionState(uint esFlags);'
$power = Add-Type -MemberDefinition $sig -Name 'Power' -Namespace 'Win32' -PassThru

# ES_CONTINUOUS (0x80000000) | ES_SYSTEM_REQUIRED (0x1): no sleep, the screen may still turn off
$null = $power::SetThreadExecutionState([uint32]2147483649)
try {
    do {
        Start-Sleep -Seconds 60
        $since = (Get-Date).AddMinutes(-$QuietMinutes)
        $busy = Get-ChildItem $Folder -Recurse -File -ErrorAction SilentlyContinue |
            Where-Object { $_.LastWriteTime -gt $since } | Select-Object -First 1
    } while ($busy)
} finally {
    $null = $power::SetThreadExecutionState([uint32]2147483648)   # back to normal
}
Write-Host "No writes for $QuietMinutes minutes. Sleep is allowed again."

ダウンロードが始まってから実行します。Steamは自分ではスリープを止めないので、スクリプトをSteamのダウンロード用フォルダーに向け、Steamは起動したままにしておきます。

powershell -ExecutionPolicy Bypass -File .\awake-while-downloading.ps1 -Folder "C:\Program Files (x86)\Steam\steamapps\downloading"

Macなら、ターミナルで同じことが2行でできます。caffeinate -i がアイドル時のスリープを止め、-w $$ でシェルが終わると止めるのもやめます。

caffeinate -i -w $$ &
while [ -n "$(find ~/Downloads -type f -mmin -5 | head -n 1)" ]; do sleep 60; done

2026年10月4日にmacOS 26.5.2で、静かな時間を1分にしてテスト用のフォルダーで実行しました。ファイルへの書き込み中は、pmset -g assertions に PreventUserIdleSystemSleep named: "caffeinate command-line tool" が出ていました。書き込みが止まるとループが終わり、この表示も消えました。フラグの意味はMacのcaffeinateコマンドにあります。

どのスクリプトを使うか

スクリプトスリープを止めるTeamsが緑Slackがアクティブ
SetThreadExecutionState止めるならないならない
1分ごとにF15止めるたいていなるたぶんなる(未計測)
powercfgのタイムアウト電源接続中は止めるならないならない
サーバー側の在席スケジュール不要ならない(Slackのみ)なる

Teamsの時間についてはTeamsが離席中になるまでの時間を、SlackのルールはSlackのアクティブ状態はどれくらい続くかを、Windowsでの選択肢はWindowsでSlackをアクティブに保つをご覧ください。スクリプト1と同じことをする既製アプリはPowerToys Awakeです。PowerToys AwakeでSlackはアクティブのままかで確かめています。

よくある質問

管理者権限は必要?

いりません。ただし、会社がPowerShellのスクリプトを禁止している場合は別です。

スクリプトを止めると設定は元に戻る?

戻ります。スクリプト1は終了時にES_CONTINUOUSだけを送り直し、スクリプト2は止めればキーを送らなくなります。powercfgで変えたタイムアウトだけは、自分で戻すまでそのままです。

Always Active

マウスを動かす必要はもうありません。

何百人ものリモートワーカーがSlackのステータスを気にしなくなりました。一度設定すれば、永遠にグリーン。

Related Articles

Guide

How to See All Your DMs in Slack, Including the Hidden Ones

The DMs tab lists your direct messages with people. App DMs, Slackbot and DMs with deleted accounts sit elsewhere. We compared the tab with the full list the Slack API returned.

Slack Green Team
Guide

Slack Images Not Showing? 5 Causes We Reproduced

We uploaded images to a Slack test channel and then switched each image setting off, ran /collapse, and posted from a bot that was not in the channel. Five causes, each reproduced.

Slack Green Team
Guide

How to Message Yourself on Slack (and What It Notifies)

Your own name under Direct messages opens a private DM with yourself. We sent it a note, a file, a scheduled message and a reminder, and checked which ones raised a badge.

Slack Green Team