【bat】バッチファイルでシャットダウン・再起動・スリープを自動化する完全ガイド|shutdown コマンドの全オプション・確認ダイアログ・時刻指定・タスクスケジューラまで

【bat】バッチファイルでシャットダウン・再起動・スリープを自動化する完全ガイド|shutdown コマンドの全オプション・確認ダイアログ・時刻指定・タスクスケジューラまで bat

バッチファイルに1行書くだけでPCをシャットダウンできます。それだけなら簡単ですが、「30分後に自動シャットダウンしたい」「確認ダイアログを出してからシャットダウンしたい」「業務処理が終わったら自動で再起動したい」となると、知っておくべきことが一気に増えます。

この記事では shutdown コマンドの全オプションを整理したうえで、実務でそのまま使える実践パターンを一通り解説します。スリープ・休止状態の切り替えや、タスクスケジューラを使った定時シャットダウンまでカバーします。

スポンサーリンク

shutdown コマンドの基本構文

shutdown コマンドは Windows に標準搭載されており、バッチファイルから呼び出すだけで PC の電源操作を自動化できます。

基本構文
shutdown [オプション]

主要オプション一覧

オプション 動作 よく使う組み合わせ
/s シャットダウン /s /t 0 /f
/r 再起動 /r /t 0 /f
/h 休止状態(ハイバネーション) /h(/t /f は使用不可)
/l ログオフ /l(/t は使用不可)
/a シャットダウンのキャンセル タイムアウト中のみ有効
/hybrid シャットダウン後に高速スタートアップを有効にする /s /hybrid /t 0
/t <秒> 実行までの待機秒数(0〜315360000) 省略時は 30 秒
/f 起動中のアプリを強制終了 未保存データは消えるので注意
/c "コメント" シャットダウン理由メッセージ(最大512文字) イベントログに記録される
/m \\コンピュータ名 リモートPCを操作 管理者権限が必要
/d [p|u:]xx:yy シャットダウン理由コード 主にサーバー管理で使用

/t オプションのデフォルトは 30 秒です。/t を省略すると 30 秒後に実行されます。即時実行したい場合は必ず /t 0 を指定してください。

シャットダウン・再起動の基本パターン

即時シャットダウン

最もシンプルな書き方です。/t 0 で待機なし、/f でアプリを強制終了します。

即時シャットダウン.bat
@echo off
shutdown /s /t 0 /f

即時再起動

即時再起動.bat
@echo off
shutdown /r /t 0 /f

カウントダウン付きシャットダウン

シャットダウンまでの時間をユーザーに知らせたい場合は /t で秒数を指定します。指定した時間内であれば shutdown /a でキャンセルできます。

60秒カウントダウン.bat
@echo off
echo 60秒後にシャットダウンします。キャンセルするには shutdown /a を実行してください。
shutdown /s /t 60

/t を指定したとき、Windowsのシステムトレイに「シャットダウンする予定」のバルーン通知が表示されます。ユーザーが気づきやすい点で便利です。

ログオフ

ログオフ.bat
@echo off
shutdown /l

高速スタートアップを使ったシャットダウン(/hybrid)

/hybrid は「シャットダウン」と「休止状態」を組み合わせた高速スタートアップ用のオプションです。次回起動を速くしたい場合に使います。ただし、BIOS/UEFI アップデートや Windows Update 後は通常の /s でシャットダウンすることをおすすめします。

高速スタートアップ用シャットダウン.bat
@echo off
rem 高速スタートアップを有効にしてシャットダウン
shutdown /s /hybrid /t 0

確認ダイアログを付けてシャットダウンする

誤実行を防ぎたい場合は choice コマンドで Y/N の確認を挟みます。y/n確認による処理分岐の応用です。

確認付きシャットダウン.bat
@echo off
echo シャットダウンしますか?
choice /c YN /m "[Y]はい  [N]いいえ"
if ERRORLEVEL 2 (
    echo キャンセルしました。
    pause
    exit /b 0
)
echo シャットダウンを実行します...
shutdown /s /t 0 /f

choice コマンドは Y を押すと ERRORLEVEL 1、N を押すと ERRORLEVEL 2 を返します。if ERRORLEVEL 2 は「2以上なら」という意味なので、必ず大きい番号から判定します。

特定の時刻になったらシャットダウンする

「22:00 になったら自動シャットダウン」のような時刻指定を実現するには、ループで現在時刻を監視します。

時刻指定シャットダウン.bat
@echo off
set TARGET_TIME=22:00

:WAIT_LOOP
rem 現在時刻の時:分を取得
for /f "tokens=1-2 delims=:" %%a in ("%TIME: =0%") do set NOW=%%a:%%b

if "%NOW%"=="%TARGET_TIME%" (
    echo %TARGET_TIME% になりました。シャットダウンします。
    shutdown /s /t 30 /f /c "定時自動シャットダウン"
    exit /b 0
)

rem 30秒ごとに確認
timeout /t 30 /nobreak >nul
goto WAIT_LOOP

日またぎに注意:このスクリプトは文字列比較で時刻を判定しています。23:50 に起動して 00:00 をターゲットにする場合などは正しく動作しません。深夜をまたぐ場合はタスクスケジューラを使う方法(後述)が確実です。

処理完了後に自動シャットダウンする

バッチ処理が終わったら自動でシャットダウンする、というパターンです。処理の成否によって動作を変えることもできます。

処理完了後シャットダウン.bat
@echo off
echo バックアップ処理を開始します...

rem ここに業務処理を記載
robocopy "D:\data" "E:\backup" /mir /r:3 /w:5 /log:"backup.log"

if ERRORLEVEL 8 (
    echo [ERROR] バックアップに失敗しました。シャットダウンをスキップします。
    pause
    exit /b 1
)

echo バックアップが完了しました。60秒後にシャットダウンします。
shutdown /s /t 60 /f /c "バックアップ完了による自動シャットダウン"

robocopy の ERRORLEVEL は特殊で、8 以上がエラーです(1〜7はコピーは成功、8以上は失敗を意味します)。コマンドによって ERRORLEVEL の意味が違うので注意してください。

シャットダウン前にログを記録する

自動シャットダウンを運用する場合、「いつシャットダウンしたか」の記録を残しておくと障害調査に役立ちます。

ログ付きシャットダウン.bat
@echo off
setlocal
set LOG=C:\logs\shutdown_log.txt

rem ログフォルダがなければ作成
if not exist "C:\logs" mkdir "C:\logs"

rem シャットダウン実行とログ記録
echo %DATE% %TIME% - 自動シャットダウンを実行しました >> "%LOG%"
shutdown /s /t 10 /f /c "自動シャットダウン(ログ記録済み)"

スリープ・休止状態に切り替える

スリープ(スタンバイ)

shutdown コマンドにはスリープオプションがありません。スリープには rundll32.exe を使います。

スリープ.bat
@echo off
rem スリープ(スタンバイ)に移行
rundll32.exe powrprof.dll,SetSuspendState 0,1,0

引数の意味:SetSuspendState ハイバネート, 強制, 起動禁止 です。0,1,0 で「ハイバネートなし(スリープ)、強制、起動イベントを禁止しない」となります。

休止状態(ハイバネーション)

休止状態には shutdown /h を使います。なお、休止状態が無効な環境では動作しません。

休止状態.bat
@echo off
rem 休止状態に移行
shutdown /h
休止状態を有効化するコマンド(管理者権限で実行)
powercfg /h on

スリープと休止状態の違い:スリープはメモリに状態を保持してすぐ復帰できます。休止状態はメモリの内容をディスクに書き込み、電源を完全にオフにします。停電があっても状態を復元できるのが休止状態の特徴です。

シャットダウンをキャンセルする

/t で待機中のシャットダウンはキャンセルできます。誤って実行したときや、監視ループでキャンセル条件に入ったときに使います。

シャットダウンキャンセル.bat
@echo off
shutdown /a
if ERRORLEVEL 1 (
    echo キャンセルできる保留中のシャットダウンがありません。
) else (
    echo シャットダウンをキャンセルしました。
)

リモート PC をシャットダウンする

同一ネットワーク上のPCをリモートでシャットダウンできます。管理者権限と対象PCでのリモートシャットダウン許可が必要です。

リモートシャットダウン.bat
@echo off
rem リモートPCをシャットダウン(管理者権限が必要)
shutdown /m \\SERVER01 /s /t 0 /f /c "リモートメンテナンス"
複数PCを一括シャットダウン.bat
@echo off
setlocal

rem シャットダウン対象PCリスト
set TARGETS=PC001 PC002 PC003 PC004

for %%p in (%TARGETS%) do (
    echo %%p をシャットダウン中...
    shutdown /m \\%%p /s /t 60 /f /c "業務終了後自動シャットダウン"
    if ERRORLEVEL 1 (
        echo [WARN] %%p へのシャットダウン命令に失敗しました。
    ) else (
        echo [OK]   %%p にシャットダウン命令を送信しました。
    )
)

echo すべての対象PCにシャットダウン命令を送信しました。
pause

リモートシャットダウンの前提条件:①対象PCで「リモートからのシャットダウン」をファイアウォールで許可、②対象PCで管理者アカウントが共有されている(ドメイン環境を推奨)。ワークグループ環境ではレジストリの LocalAccountTokenFilterPolicy 設定も必要な場合があります。

タスクスケジューラで定時シャットダウンを設定する

schtasks コマンドを使えば、バッチファイルなしで直接タスクを登録できます。毎日同じ時刻にシャットダウンしたい場合はこちらが確実です。

定時シャットダウンタスクを登録(管理者権限で実行)
rem 毎日 23:00 にシャットダウンするタスクを登録
schtasks /create /tn "定時シャットダウン" /tr "shutdown /s /t 0 /f" /sc daily /st 23:00 /ru SYSTEM /f

rem 登録確認
schtasks /query /tn "定時シャットダウン"

rem タスクを削除するには
rem schtasks /delete /tn "定時シャットダウン" /f

また、バッチファイル自身がタスクを登録してシャットダウンを予約する方法は、タスクスケジューラ自動登録のガイドをあわせて参照してください。

起動時・ログイン時にシャットダウンスケジュールを設定する

PC 起動・ログイン時の自動実行と組み合わせれば、「ログインしたら XX 時間後に自動シャットダウンをセットする」という使い方もできます。

起動時にシャットダウン予約を設定.bat
@echo off
rem 起動後8時間(28800秒)後にシャットダウン予約
shutdown /s /t 28800 /f /c "8時間経過による自動シャットダウン"
echo 8時間後に自動シャットダウンが設定されました。
echo キャンセルするには: shutdown /a

プロセスの終了を待ってからシャットダウンする

バックアップや長時間処理が終わったことを確認してシャットダウンしたい場合は、プロセスの終了を待つ方法と組み合わせます。

プロセス終了後シャットダウン.bat
@echo off
setlocal
set TARGET_PROC=backup.exe

echo %TARGET_PROC% の終了を待機中...

:WAIT_PROC
tasklist /fi "imagename eq %TARGET_PROC%" 2>nul | find /i "%TARGET_PROC%" >nul
if %ERRORLEVEL%==0 (
    timeout /t 30 /nobreak >nul
    goto WAIT_PROC
)

echo %TARGET_PROC% が終了しました。シャットダウンします。
shutdown /s /t 60 /f /c "バックアップ完了"

管理者権限が必要な場合の対処

リモートシャットダウンや一部の電源操作は管理者権限が必要です。管理者権限の自動取得の方法と組み合わせて使ってください。

管理者権限チェック付きシャットダウン.bat
@echo off
rem 管理者権限チェック
net session >nul 2>&1
if ERRORLEVEL 1 (
    echo [ERROR] 管理者権限が必要です。
    echo このスクリプトを右クリックして「管理者として実行」してください。
    pause
    exit /b 1
)

echo 管理者権限を確認しました。シャットダウンを実行します。
shutdown /s /t 0 /f

よくあるトラブルと対処法

症状 原因 対処法
シャットダウンされない(何も起きない) /t を省略して30秒待機中、またはコマンドが実行されていない /t 0 を追加する。タスクスケジューラからの実行の場合は権限設定を見直す
アプリが閉じずに処理が止まる 未保存ダイアログが表示されている /f を追加して強制終了する
リモートPCに接続できない ファイアウォールがブロック、またはネットワーク経路の問題 Windows ファイアウォールで「リモートシャットダウン」を許可する。ping で疎通確認をする
shutdown /h が実行できない 休止状態が無効になっている 管理者権限で powercfg /h on を実行する
shutdown /a でキャンセルできない /t 0 で即時実行してしまっている /t に数秒以上を指定してキャンセル可能にする
タスクスケジューラから動作しない 権限不足または作業フォルダの問題 「最上位の特権で実行」を有効にする。実行アカウントに管理者権限があるか確認する
/hybrid でシャットダウンしたのに次回起動が遅い SSD でないとハイブリッドシャットダウンの効果が出にくい 通常の /s を使う。または BIOS 設定で Fast Boot を有効にする

まとめ

shutdown コマンドの主要パターンを整理します。

やりたいこと コマンド ポイント
今すぐシャットダウン shutdown /s /t 0 /f /t 0 で即時、/f で強制終了
今すぐ再起動 shutdown /r /t 0 /f
N秒後にシャットダウン shutdown /s /t N バルーン通知が表示される
シャットダウンをキャンセル shutdown /a /t が 0 より大きい場合のみ有効
スリープ rundll32.exe powrprof.dll,SetSuspendState 0,1,0 メモリ保持・高速復帰
休止状態 shutdown /h 電源オフ・停電に強い
ログオフ shutdown /l PCはそのまま
リモートPCをシャットダウン shutdown /m \\PC名 /s /t 0 /f 管理者権限・FW許可が必要
高速スタートアップ付きシャットダウン shutdown /s /hybrid /t 0 次回起動を高速化

タスクスケジューラと組み合わせれば、完全無人での電源管理も実現できます。用途に合わせてパターンを使い分けてください。

よくある質問

shutdown コマンドと taskkill /f は何が違いますか?
taskkill は個別プロセスを終了させるコマンドで、PC の電源操作はできません。shutdown /s /f は OS 全体をシャットダウンしながらすべてのプロセスを強制終了します。特定のアプリだけ終了させたい場合は taskkill を、PC ごとシャットダウンしたい場合は shutdown を使います。
/f(強制終了)を使うと未保存データは消えますか?
はい、消えます。/f は保存確認ダイアログを無視して強制終了するため、未保存の Word や Excel のデータは失われます。自動化スクリプトで /f を使う場合は、事前にデータを保存済みの状態にしておくか、シャットダウン前に対象アプリを明示的に終了させる処理を入れてください。
バッチをダブルクリックした瞬間にシャットダウンが走るのが怖いです。
確認ダイアログを入れることをおすすめします。この記事の「確認ダイアログ付きシャットダウン」のパターンを使えば、Y キーを押すまでシャットダウンしません。choice コマンドのタイムアウト(/t オプション)でデフォルト動作を設定することも可能です。
スリープと休止状態の使い分けを教えてください。
短時間の離席には「スリープ」、長時間使わない・電源を抜く場合は「休止状態」が適しています。スリープはメモリへの給電が続き復帰が速い反面、停電でデータが失われます。休止状態はメモリ内容をディスクに保存して完全に電源オフするため、復帰は遅くなりますが停電があっても状態が保持されます。
タスクスケジューラからバッチを実行するとシャットダウンが動かない。
タスクスケジューラからの実行では権限設定に注意が必要です。「タスクの実行に使うアカウント」を管理者権限のあるアカウントにし、「最上位の特権で実行する」にチェックを入れてください。また、タスクの「全般」タブで「ユーザーがログオンしているかどうかにかかわらず実行する」を選択するとより確実に動作します。
shutdown コマンドで指定できる最長の待機時間はどれくらいですか?
/t オプションの最大値は 315360000 秒(約10年)です。実用的には数分〜数時間の範囲で使うことが多いです。長時間後のシャットダウンを確実に実行したい場合は、長い /t 値を指定するよりも、タスクスケジューラで時刻指定する方が確実です。OS の再起動やログオフがあっても予約が失われないためです。