はじめに

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.exeshutdown.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

StartScanStartDownload は非同期ですが、すぐに次のコマンドを打っても内部的にキューイングされるため、待ち処理は不要です。

ステップ 2:インストールと即再起動

Bat
echo 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:終了コードで結果を判定(オプション)

Bat
if %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 でトレースできます。

ハマった点と解決策

  1. 「StartInstall が即終了しても更新が入らない」
    原因:WSUS で承認されていない、またはグループポリシーで「自動ダウンロード・自動インストール」が無効。
    解決:ローカル GPO (gpedit.msc) → コンピューター構成 → 管理用テンプレート → Windows コンポーネント → Windows Update → 「自動更新を構成する」を「2 - 自動ダウンロード・自動インストール」にしておく。WSUS の場合は承認も忘れずに。

  2. 「バッチをダブルクリックしても何も起きない」
    原因:管理者権限で起動していない。
    解決:バッチのプロパティ → 詳細設定 → 「管理者権限で実行する」にチェック。または、タスクスケジューラーから「最上位の特権で実行」にする。

  3. 「再起動後、更新がロールバックされる」
    原因:更新プログラムが他の更新と衝突、または .NET 等の大きな累積更新の直後。
    解決:バッチ実行前に sfc /scannowdism /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