はじめに
WSUS(Windows Server Update Services)を使っていても、承認済みの更新がクライアントに届くタイミングは「〜22時頃」「次回の自動メンテナンス」などぼやけています。
「今すぐ全部当てて再起動したい」という場面(夜間メンテナンス、検証環境の立ち上げ、AD 統合の CI パイプラインなど)で、GUI をポチポチするのは時間の無駴です。
この記事を読めば、管理者権限でダブルクリック一発で Windows Update をフル自動適用し、即再起動するバッチファイルの作り方がわかります。PowerShell 実行ポリシーや冗長なモジュールのインストールも不要です。
前提知識
- コマンドプロンプトと管理者権限の概念がわかる
- Windows 10/11 または Windows Server 2016 以降を対象とする
- WSUS 環境でなくても Windows Update サービスが動いていれば可
なぜ「バッチ」なのか
PowerShell には PSWindowsUpdate モジュールがありますが、
- 社内ポリシーで署名されていないスクリプトが実行不可
- モジュールのインストールがブロックされる
- 既に展開済みのレガシー環境で PowerShell 5.1 固定
といった制約をよく受けます。
一方、usoclient.exe と shutdown.exe の組み合わせなら、デフォルトで標準搭載かつ署名済みですぐ動きます。
短く、ログも出せばトラブルシュートもラクです。
30 行で書ける完全自動バッチの作り方
ステップ 1:更新プログラムのスキャンとダウンロード
usoclient はコマンドランドスイッチが非公開ですが、以下の順番で呼ぶと「スキャン→ダウンロード→インストール→再起動」ができます。
Bat@echo off setlocal enabledelayedexpansion set LOG=%~dpn0_%date:~-4%%date:~3,2%%date:~0,2%.log echo %date% %time% === Windows Update 自動適用開始 === >> "%LOG%" echo 1. スキャン >> "%LOG%" usoclient StartScan >> "%LOG%" 2>&1 echo 2. ダウンロード >> "%LOG%" usoclient StartDownload >> "%LOG%" 2>&1
StartScan と StartDownload は非同期ですが、すぐに次のコマンドを打っても内部的にキューイングされるため、待ち処理は不要です。
ステップ 2:インストールと即再起動
Batecho 3. インストール >> "%LOG%" usoclient StartInstall >> "%LOG%" 2>&1 echo 4. 再起動タイマー 30秒 >> "%LOG%" shutdown.exe /r /t 30 /c "Windows Update 適用のため 30 秒後に再起動します"
/t 30 を 0 にすれば即再起動ですが、リモートデスクトップで作業中の場合に 30 秒あれば作業を終えてログアウトできます。
usoclient ResumeUpdate を入れると、更新の再開も兼ねてくれます(スケジュール済みの再起留めを回避)。
ステップ 3:終了コードで結果を判定(オプション)
Batif %errorlevel% equ 0 ( echo %date% %time% 正常終了 >> "%LOG%" ) else ( echo %date% %time% エラー コード=%errorlevel% >> "%LOG%" )
%errorlevel% は usoclient 内部で返ってこないため、あくまで shutdown の成否です。
より厳密にやりたい場合は、Windows Update ログ %windir%\Logs\WindowsUpdate\WindowsUpdate.log または Get-WindowsUpdateLog でトレースできます。
ハマった点と解決策
-
「StartInstall が即終了しても更新が入らない」
原因:WSUS で承認されていない、またはグループポリシーで「自動ダウンロード・自動インストール」が無効。
解決:ローカル GPO (gpedit.msc) → コンピューター構成 → 管理用テンプレート → Windows コンポーネント → Windows Update → 「自動更新を構成する」を「2 - 自動ダウンロード・自動インストール」にしておく。WSUS の場合は承認も忘れずに。 -
「バッチをダブルクリックしても何も起きない」
原因:管理者権限で起動していない。
解決:バッチのプロパティ → 詳細設定 → 「管理者権限で実行する」にチェック。または、タスクスケジューラーから「最上位の特権で実行」にする。 -
「再起動後、更新がロールバックされる」
原因:更新プログラムが他の更新と衝突、または .NET 等の大きな累積更新の直後。
解決:バッチ実行前にsfc /scannowとdism /online /cleanup-image /restorehealthで構成を整えておくと失敗率が下がります。
まとめ
本記事では、WSUS/Windows Update を「今すぐ全部適用&再起動」する最短バッチファイルを紹介しました。
- 管理者権限さえあれば、標準ツール(usoclient + shutdown)だけで完結
- PowerShell モジュールのインストールや実行ポリシーの変更不要
- ログを残してトラブルシュートも簡単
このバッチをタスクスケジューラーに登録すれば、毎週土曜 3:00 など定期的なメンテナンスも楽になります。
次回は「再起動後、さらに次の更新がある場合の自動再実行」を PowerShell で回す方法を紹介します。
参考資料
- Windows Update クライアント コマンドライン スイッチ(非公式 Tips 集)
https://www.google.com/search?q=usoclient+command+line+switches - Microsoft Docs: 自動更新を構成する
https://learn.microsoft.com/ja-jp/windows/deployment/update/waas-restart - グループポリシー リファレンス(Windows Update セクション)
https://www.google.com/search?q=admx+windows+update+ja
