【bat】バッチファイルでWindows Updateを自動実行する方法

【bat】バッチファイルでWindows Updateを自動実行する方法 bat

Windowsの更新作業を手作業で行っていると、確認・クリック・再起動の繰り返しで時間を取られます。特に複数台のPCを管理するIT担当者や、定期メンテナンスを自動化したいエンジニアにとって、Windows Updateの手動対応は大きな負担です。バッチファイルを使えば、スキャン・ダウンロード・インストールまでを一括で実行でき、タスクスケジューラと組み合わせることで完全な自動化が実現します。

本記事では、Windows標準コマンドのUsoClientや旧環境向けのwuauclt、そして高機能なPowerShellモジュールPSWindowsUpdateを使った3つのアプローチを解説します。それぞれの特徴・適用場面・コード例を詳しく説明するため、自分の環境に合った方法を選択できます。

さらに、ログ収集・再起動制御・タスクスケジューラ登録・WSUS環境対応・トラブルシューティングまで網羅した実践的な内容です。読み終えれば、業務端末やサーバーに即投入できる月次パッチ適用バッチを自分で構築できるようになります。

スポンサーリンク

Windows Update 自動化の3つのアプローチ比較

バッチファイルでWindows Updateを自動化する方法は主に3種類あります。それぞれの特徴を理解して、環境に合ったアプローチを選びましょう。

方法 対応OS 特徴 難易度 推奨場面
UsoClient Windows 10/11 標準搭載、追加インストール不要 ★☆☆ シンプルな更新実行
wuauclt Windows 7〜10 旧環境互換、一部機能のみ ★☆☆ 古いOSへの対応
PSWindowsUpdate Windows 7以降 詳細制御・ログ・フィルタリング可能 ★★☆ 本格的な自動化・企業環境

選択の目安

  • Windows 10/11の個人PC・小規模環境 → UsoClient
  • Windows 7/8.1などの旧OS → wuauclt
  • 複数台管理・フィルタリング・詳細ログが必要 → PSWindowsUpdate

前提:管理者権限での実行とサービス確認

Windows Updateをバッチから操作するには、管理者権限が必須です。また、Windows Update関連サービスが正常に動作していることを事前に確認します。

管理者権限チェックのバッチコード

check-admin.bat – 管理者権限チェック
@echo off
setlocal

rem 管理者権限チェック
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo エラー: 管理者権限が必要です。
    echo 右クリック →「管理者として実行」で再実行してください。
    pause
    exit /b 1
)
echo 管理者権限: OK

Windows Updateサービスの状態確認

check-wuservice.bat – サービス確認
rem Windows Updateサービスの状態確認
sc query wuauserv | find "STATE"

rem サービスが停止している場合は起動
sc start wuauserv
sc start bits

rem Update Orchestrator Serviceも確認
sc query UsoSvc | find "STATE"
サービス名 表示名 役割
wuauserv Windows Update 更新の検出・ダウンロード・インストール
bits Background Intelligent Transfer Service バックグラウンドダウンロード
UsoSvc Update Orchestrator Service 更新処理の調整(Win10以降)
cryptsvc Cryptographic Services 証明書・署名検証

方法1:UsoClientによる基本バッチ

UsoClientはWindows 10以降に標準搭載されたコマンドラインツールで、Windows Updateの各フェーズを個別に制御できます。追加インストール不要で最もシンプルな自動化が可能です。

UsoClientの主要コマンド一覧

コマンド 動作 備考
StartScan 更新のスキャン(検出) 非同期実行
StartDownload 更新のダウンロード 非同期実行
StartInstall 更新のインストール 非同期実行
ScanInstallWait スキャン〜インストールを同期実行 完了まで待機
StartInteractiveScan インタラクティブスキャン UI操作向け
RefreshSettings 設定の再読み込み ポリシー変更後に使用
ResumeUpdate 中断した更新を再開

UsoClientを使った基本バッチ

wu-usoclient-basic.bat – UsoClientによる基本更新バッチ
@echo off
setlocal enabledelayedexpansion

rem ============================================
rem Windows Update 自動実行バッチ(UsoClient版)
rem 対応OS: Windows 10 / Windows 11
rem ============================================

rem 管理者権限チェック
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo [ERROR] 管理者権限で実行してください
    exit /b 1
)

echo [%date% %time%] Windows Update を開始します

rem Windows Updateサービスを起動
sc start wuauserv >nul 2>&1
sc start bits    >nul 2>&1
sc start UsoSvc  >nul 2>&1
timeout /t 3 /nobreak >nul

rem フェーズ1: スキャン
echo [%time%] フェーズ1: 更新のスキャン中...
UsoClient StartScan
timeout /t 60 /nobreak >nul

rem フェーズ2: ダウンロード
echo [%time%] フェーズ2: 更新のダウンロード中...
UsoClient StartDownload
timeout /t 300 /nobreak >nul

rem フェーズ3: インストール
echo [%time%] フェーズ3: 更新のインストール中...
UsoClient StartInstall
timeout /t 300 /nobreak >nul

echo [%time%] Windows Update 処理を開始しました
echo ※ バックグラウンドで処理が続いています
echo ※ 完了後に再起動が必要な場合があります

endlocal

注意:UsoClientのコマンドは非同期実行(バックグラウンドで処理開始)のため、コマンド完了≠更新完了です。ScanInstallWaitを使うと同期実行になりますが、処理完了まで待機します。

ScanInstallWaitで同期実行する方法

wu-usoclient-sync.bat – 同期実行版
@echo off
rem スキャン〜インストールまで同期実行(完了まで待機)
echo [%date% %time%] 更新処理開始(同期モード)
UsoClient ScanInstallWait
echo [%date% %time%] 更新処理が完了しました(exitcode: %errorlevel%)

方法2:wuaucltによる旧環境対応バッチ

wuauclt(Windows Update Auto Update Client)はWindows Vista〜10で利用できる旧来のコマンドです。Windows 11では機能が大幅に制限されており、旧OS環境の保守に活用します。

wuaucltの主要オプション一覧

オプション 動作 対応OS
/detectnow 今すぐ更新を検出 Vista〜10
/updatenow 今すぐ更新を実行 Win10のみ
/resetauthorization WSUSの認証をリセット Vista〜10
/reportnow WSUSにレポートを送信 Vista〜10
/showwu Windows Update UIを表示 Vista〜10

wuaucltを使ったバッチ(旧環境向け)

wu-wuauclt-legacy.bat – 旧環境対応バッチ
@echo off
setlocal

rem ============================================
rem Windows Update バッチ(wuauclt旧環境版)
rem 対応: Windows 7 / 8.1 / 10
rem ============================================

rem 管理者権限チェック
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo 管理者権限が必要です
    exit /b 1
)

rem Windows Updateサービス起動
net start wuauserv >nul 2>&1
net start bits    >nul 2>&1

echo [%date% %time%] 更新の検出を開始...
wuauclt /detectnow

rem 検出完了を待機
timeout /t 60 /nobreak >nul

rem Windows 10の場合は更新実行
echo [%date% %time%] 更新のインストールを開始...
wuauclt /updatenow

echo [%date% %time%] 処理を開始しました(バックグラウンドで実行中)
endlocal

注意:wuaucltはWindows 11では動作しません。また/updatenowはWindows 10限定です。Windows 7/8.1では/detectnowのみ有効で、インストール自体はWindowsが自動スケジュールします。

方法3:PSWindowsUpdateモジュールのインストールと基本使用法

PSWindowsUpdateはPowerShell Gallery公開のサードパーティモジュールで、Windows Updateの詳細制御が可能です。フィルタリング・ログ出力・WSUS対応など企業環境で求められる機能を網羅しています。

PSWindowsUpdateのインストール

PowerShell(管理者) – PSWindowsUpdateインストール
# NuGetプロバイダーを先にインストール
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force

# PSWindowsUpdateをインストール
Install-Module -Name PSWindowsUpdate -Force -Scope AllUsers

# インストール確認
Get-Module -ListAvailable PSWindowsUpdate

# 利用可能なコマンド一覧
Get-Command -Module PSWindowsUpdate

PSWindowsUpdateの主要コマンド

  • Get-WindowsUpdate — 利用可能な更新を取得・表示
  • Install-WindowsUpdate — 更新をインストール
  • Remove-WindowsUpdate — 更新をアンインストール
  • Get-WUHistory — 更新履歴を取得
  • Get-WURebootStatus — 再起動が必要かチェック
  • Invoke-WUJob — リモートPCに更新ジョブを送信

PSWindowsUpdateの基本的な使い方

PowerShell – 基本操作例
# モジュールを読み込む
Import-Module PSWindowsUpdate

# 利用可能な更新一覧を表示(インストールはしない)
Get-WindowsUpdate

# すべての更新を確認なしでインストール
Install-WindowsUpdate -AcceptAll -AutoReboot

# 更新履歴を確認
Get-WUHistory | Select-Object -First 10

# 再起動が必要かチェック
Get-WURebootStatus

バッチからPSWindowsUpdateを呼び出す完全テンプレート

バッチファイル(.bat)からPowerShellスクリプトを呼び出すことで、スケジュール登録や他のバッチ処理との連携が容易になります。

wu-pswu-launcher.bat – PSWindowsUpdate呼び出しバッチ
@echo off
setlocal enabledelayedexpansion

rem ============================================
rem Windows Update バッチ(PSWindowsUpdate版)
rem ============================================

set LOGDIR=C:\WU_Logs
set LOGFILE=%LOGDIR%\wu_%date:~0,4%%date:~5,2%%date:~8,2%.log
set PSSCRIPT=%~dp0wu-update.ps1

rem ログディレクトリ作成
if not exist %LOGDIR% mkdir %LOGDIR%

rem 管理者権限チェック
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo [ERROR] 管理者権限が必要です >> %LOGFILE%
    exit /b 1
)

echo ====================================== >> %LOGFILE%
echo [%date% %time%] Windows Update 開始 >> %LOGFILE%
echo ====================================== >> %LOGFILE%

rem PowerShellスクリプトを実行
powershell -ExecutionPolicy Bypass -NonInteractive -File "%PSSCRIPT%" >> %LOGFILE% 2>&1

set EXITCODE=%errorlevel%
echo [%date% %time%] 終了コード: %EXITCODE% >> %LOGFILE%

exit /b %EXITCODE%
wu-update.ps1 – PSWindowsUpdate実行スクリプト
# PSWindowsUpdateモジュールのインポート
Import-Module PSWindowsUpdate -ErrorAction Stop

Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 更新スキャン開始"

# 利用可能な更新を取得
$updates = Get-WindowsUpdate -AcceptAll

if ($updates.Count -eq 0) {
    Write-Host "適用する更新はありません"
    exit 0
}

Write-Host "$($updates.Count) 件の更新が見つかりました"
$updates | Select-Object Title, KB, Size | Format-Table -AutoSize

# 更新をインストール(自動再起動あり)
Install-WindowsUpdate -AcceptAll -AutoReboot -Verbose

Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] インストール完了"

Get-WindowsUpdateで更新情報を取得・フィルタリングする

Get-WindowsUpdateコマンドは豊富なフィルタリングオプションを持っており、セキュリティ更新のみ・特定KBのみ・ドライバー除外など細かい制御が可能です。

PowerShell – Get-WindowsUpdateフィルタリング例
# セキュリティ更新のみ取得
Get-WindowsUpdate -Category "Security Updates"

# 特定のKB番号を指定
Get-WindowsUpdate -KBArticleID "KB5034441"

# ドライバーを除外
Get-WindowsUpdate -NotCategory "Drivers"

# タイトルでフィルタリング(Defenderのみ)
Get-WindowsUpdate -Title "*Defender*"

# 重要度でフィルタリング
Get-WindowsUpdate -MicrosoftUpdate | Where-Object {$_.MsrcSeverity -eq "Critical"}

# 更新のサイズも含めて表示
Get-WindowsUpdate | Select-Object Title, KB, Size, MsrcSeverity | Format-Table

# 更新をダウンロードのみ(インストールしない)
Get-WindowsUpdate -AcceptAll -Download -NotInstall

Install-WindowsUpdateのオプション詳細

オプション 説明 推奨場面
-AcceptAll すべての更新を確認なしで承認 自動実行時
-AutoReboot 必要に応じて自動再起動 夜間バッチ
-IgnoreReboot 再起動を抑制(後で手動再起動) 業務中・サーバー
-ScheduleReboot 再起動スケジュールを指定 メンテナンス窓指定
-Download ダウンロードのみ(インストールしない) 事前準備
-NotInstall インストールをスキップ -Downloadとの組み合わせ
-KBArticleID 特定KBのみインストール 特定パッチ適用
-NotKBArticleID 特定KBを除外 問題ある更新を除外
-Category カテゴリでフィルタリング セキュリティのみ等
-SendReport WSUSへの報告を送信 WSUS環境
-Verbose 詳細な進行状況を表示 ログ取得時

再起動ポリシーと安全設計

Windows Updateの自動実行で最も注意が必要なのが再起動の制御です。業務時間中の意図しない再起動はデータ損失や業務中断を引き起こす可能性があります。

再起動ポリシーの設計パターン

wu-reboot-policy.ps1 – 再起動制御の実装例
Import-Module PSWindowsUpdate

# 現在時刻で再起動可否を判断
$now = Get-Date
$maintenanceStart = Get-Date "02:00"
$maintenanceEnd   = Get-Date "05:00"

$inMaintenance = ($now -ge $maintenanceStart) -and ($now -lt $maintenanceEnd)

if ($inMaintenance) {
    # メンテナンス時間内: 自動再起動OK
    Write-Host "メンテナンス時間内: 自動再起動を許可"
    Install-WindowsUpdate -AcceptAll -AutoReboot -Verbose
} else {
    # 業務時間帯: 再起動を抑制
    Write-Host "業務時間帯: 再起動を抑制してインストール"
    Install-WindowsUpdate -AcceptAll -IgnoreReboot -Verbose

    # 再起動が必要か確認し、予約
    $rebootNeeded = Get-WURebootStatus -Silent
    if ($rebootNeeded) {
        # 翌日02:00に再起動スケジュール
        $rebootTime = (Get-Date).AddDays(1).Date.AddHours(2)
        Install-WindowsUpdate -AcceptAll -ScheduleReboot $rebootTime
        Write-Host "再起動を $rebootTime にスケジュールしました"
    }
}
環境 推奨設定 理由
個人PC -AutoReboot 深夜バッチ実行なら問題なし
業務端末 -ScheduleReboot メンテナンス時間を明示
Windowsサーバー -IgnoreReboot + 手動確認 サービス停止リスクを回避
クラスター環境 -IgnoreReboot + フェールオーバー後 可用性確保

ポイント:Get-WURebootStatusを使えば、更新インストール後に再起動が必要かどうかをスクリプト内でチェックできます。-Silentオプションを付けると戻り値がTrue/Falseになり、条件分岐で使いやすくなります。

更新結果のログ収集とイベントビューアー活用

Windows Updateの実行結果を確実に記録することで、問題発生時の調査が容易になります。PSWindowsUpdateのログ出力機能とWindowsイベントログを組み合わせた方法を解説します。

PSWindowsUpdateでログを記録する

wu-with-log.ps1 – ログ付き更新スクリプト
Import-Module PSWindowsUpdate

$LogPath = "C:\WU_Logs\wu-$(Get-Date -Format 'yyyyMMdd-HHmmss').log"

# PSWindowsUpdateの組み込みログ機能を使用
Install-WindowsUpdate `
    -AcceptAll `
    -IgnoreReboot `
    -Verbose `
    4>&1 | Tee-Object -FilePath $LogPath

# 更新履歴もログに追記
Add-Content -Path $LogPath -Value "`n=== 更新履歴(直近5件)==="
Get-WUHistory | Select-Object -First 5 | Format-Table -AutoSize | Out-String | Add-Content -Path $LogPath

Write-Host "ログを保存しました: $LogPath"

イベントビューアーからWindows Update履歴を収集

wu-event-log.ps1 – イベントログからWU履歴を収集
# Windows Updateのイベントログを取得
# イベントID 19: インストール成功, 20: インストール失敗
$events = Get-WinEvent -LogName "System" -FilterXPath '*[System[Provider[@Name="Microsoft-Windows-WindowsUpdateClient"] and (EventID=19 or EventID=20)]]' -MaxEvents 20 -ErrorAction SilentlyContinue

$events | Select-Object TimeCreated, Id, Message | Format-Table -Wrap

# WindowsUpdate.logを確認(Win10以降はETLフォーマット)
Get-WindowsUpdateLog
# → デスクトップに WindowsUpdate.log が生成される

# 過去7日間のWUイベントをCSVに出力
$since = (Get-Date).AddDays(-7)
Get-WinEvent -LogName "System" | Where-Object {
    $_.ProviderName -eq "Microsoft-Windows-WindowsUpdateClient" -and $_.TimeCreated -gt $since
} | Export-Csv -Path "C:\WU_Logs\wu-events.csv" -NoTypeInformation -Encoding UTF8
イベントID 意味 ログ名
19 更新インストール成功 System
20 更新インストール失敗 System
43 更新ダウンロード開始 System
44 更新ダウンロード完了 System

タスクスケジューラへの登録(schtasks完全ガイド)

バッチファイルをタスクスケジューラに登録することで、定期的な自動実行を実現します。schtasksコマンドでGUIを使わずにスクリプトから登録・管理できます。

基本的なタスク登録

register-task.bat – タスクスケジューラ登録
@echo off
setlocal

rem タスク名と実行ファイルのパス
set TASKNAME="Monthly_WindowsUpdate"
set BATFILE="C:\Scripts\wu-monthly.bat"

rem タスクを削除(既存分)
schtasks /delete /tn %TASKNAME% /f >nul 2>&1

rem タスクを登録(毎月第2火曜日 02:00)
schtasks /create ^
    /tn %TASKNAME% ^
    /tr %BATFILE% ^
    /sc monthly ^
    /mo second ^
    /d TUE ^
    /st 02:00 ^
    /ru SYSTEM ^
    /rl highest ^
    /f

echo タスクを登録しました: %TASKNAME%
schtasks /query /tn %TASKNAME%

endlocal

schtasksの主要オプション

オプション 値の例 説明
/sc monthly, weekly, daily, once スケジュール種別
/mo second, first, last, 1〜12 繰り返し修飾子
/d MON, TUE, WED, THU, FRI, SAT, SUN 実行曜日
/st 02:00(HH:MM形式) 開始時刻
/ru SYSTEM, Administrator 実行ユーザー
/rl highest, limited 権限レベル(最高特権)
/f (なし) 強制上書き登録
schtasks – タスク管理コマンド集
rem タスク一覧表示
schtasks /query /fo LIST /v | findstr "TaskName"

rem 特定タスクの詳細確認
schtasks /query /tn "Monthly_WindowsUpdate" /fo LIST /v

rem タスクを今すぐ実行
schtasks /run /tn "Monthly_WindowsUpdate"

rem タスクを無効化
schtasks /change /tn "Monthly_WindowsUpdate" /disable

rem タスクを有効化
schtasks /change /tn "Monthly_WindowsUpdate" /enable

rem タスクを削除
schtasks /delete /tn "Monthly_WindowsUpdate" /f

WSUS環境での使い方(-UseWUServerオプション)

企業ネットワークではWSUS(Windows Server Update Services)を経由してWindows Updateを管理するケースが多くあります。PSWindowsUpdateはWSUSとWindows Updateの両方を切り替えて使用できます。

wu-wsus.ps1 – WSUS経由での更新
Import-Module PSWindowsUpdate

# WSUS経由で更新を取得(-UseWUServer指定)
Get-WindowsUpdate -UseWUServer

# WSUSからインストール(再起動抑制)
Install-WindowsUpdate -UseWUServer -AcceptAll -IgnoreReboot -Verbose

# WSUSをバイパスしてMicrosoft Updateから直接取得
# (WSUSに承認されていない更新を取得したい場合)
Get-WindowsUpdate -MicrosoftUpdate

# WSUS登録状態を確認
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" | Select-Object WUServer, WUStatusServer

# WSUSへレポートを送信
wuauclt /reportnow

WSUS環境での注意点

  • WSUSで承認された更新のみインストール対象になる(デフォルト)
  • -MicrosoftUpdateを使うとWSUSをバイパスしてMSから直接取得できる
  • VPN接続が必要な場合はバッチの先頭でVPN接続状態をチェックする
  • WSUS URL はHKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdateに格納

実践テンプレート:月次パッチ適用バッチ(ログ・通知・再起動制御付き)

実際の運用に使える完全版バッチテンプレートです。ログ出力・再起動時間制御・処理結果の通知まで一通り実装しています。

wu-monthly.bat – 月次パッチ適用バッチ(ランチャー)
@echo off
setlocal enabledelayedexpansion

rem ============================================================
rem 月次パッチ適用バッチ
rem スケジュール: 毎月第2火曜日 02:00 (SYSTEM権限)
rem ============================================================

set SCRIPTDIR=%~dp0
set LOGDIR=C:\WU_Logs
set DATESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%
set LOGFILE=%LOGDIR%\monthly_wu_%DATESTAMP%.log
set PSSCRIPT=%SCRIPTDIR%wu-monthly.ps1

rem ログディレクトリ作成
if not exist %LOGDIR% mkdir %LOGDIR%

rem 管理者権限チェック
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo [%date% %time%][ERROR] 管理者権限が必要です >> %LOGFILE%
    exit /b 1
)

rem ヘッダーログ出力
echo ============================================================ >> %LOGFILE%
echo [%date% %time%] 月次Windowsアップデート 開始 >> %LOGFILE%
echo コンピュータ名: %COMPUTERNAME% >> %LOGFILE%
echo ============================================================ >> %LOGFILE%

rem PSスクリプトを実行
powershell -ExecutionPolicy Bypass -NonInteractive ^
    -File "%PSSCRIPT%" ^
    -LogFile "%LOGFILE%" >> %LOGFILE% 2>&1

set RESULT=%errorlevel%
echo [%date% %time%] 終了コード: %RESULT% >> %LOGFILE%

rem 古いログを削除(90日以上前)
forfiles /p %LOGDIR% /s /m *.log /d -90 /c "cmd /c del @path" >nul 2>&1

exit /b %RESULT%
wu-monthly.ps1 – 月次パッチ適用スクリプト(完全版)
param(
    [string]$LogFile = "C:\WU_Logs\wu-monthly.log"
)

Import-Module PSWindowsUpdate -ErrorAction Stop

# ログ関数
function Write-Log {
    param([string]$Message, [string]$Level = "INFO")
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $line = "[$timestamp][$Level] $Message"
    Write-Host $line
}

# メンテナンス時間チェック(02:00〜05:00のみ自動再起動)
$hour = (Get-Date).Hour
$autoReboot = ($hour -ge 2 -and $hour -lt 5)

Write-Log "=== 月次パッチ適用 開始 ==="
Write-Log "コンピュータ: $env:COMPUTERNAME"
Write-Log "自動再起動: $autoReboot"

# 更新のスキャン
Write-Log "更新のスキャン中..."
$updates = Get-WindowsUpdate -AcceptAll -ErrorAction Stop

if ($updates.Count -eq 0) {
    Write-Log "適用する更新はありません"
    exit 0
}

Write-Log "$($updates.Count) 件の更新が見つかりました"
$updates | ForEach-Object {
    Write-Log "  - $($_.Title) [KB$($_.KBArticleIDs -join ',')]"
}

# インストール実行
Write-Log "インストール開始..."
try {
    if ($autoReboot) {
        Install-WindowsUpdate -AcceptAll -AutoReboot -Verbose -ErrorAction Stop
    } else {
        Install-WindowsUpdate -AcceptAll -IgnoreReboot -Verbose -ErrorAction Stop

        # 翌日02:00に再起動をスケジュール
        $rebootNeeded = Get-WURebootStatus -Silent
        if ($rebootNeeded) {
            $nextReboot = (Get-Date).AddDays(1).Date.AddHours(2)
            Write-Log "再起動を $nextReboot にスケジュール"
            shutdown /r /t 0 /d p:2:4 /c "月次パッチ適用後の再起動"
        }
    }
    Write-Log "インストール完了"
} catch {
    Write-Log "エラー: $($_.Exception.Message)" "ERROR"
    exit 1
}

# 更新履歴をログに記録
Write-Log "=== インストール済み更新 ==="
Get-WUHistory | Where-Object { $_.Date -gt (Get-Date).AddHours(-12) } | ForEach-Object {
    Write-Log "  [$($_.ResultCode)] $($_.Title)"
}

Write-Log "=== 月次パッチ適用 完了 ==="

トラブルシューティング

症状・エラー 原因 対処法
UsoClientが動かない UsoSvcが停止中 sc start UsoSvcで起動
PSWindowsUpdateがインストールできない NuGetプロバイダー未インストール Install-PackageProvider -Name NuGet -Force
ExecutionPolicy エラー スクリプト実行が禁止 -ExecutionPolicy Bypassを付けるかSet-ExecutionPolicy RemoteSigned
更新が見つからない(WSUS環境) WSUSで未承認 -MicrosoftUpdateでMSから直接取得するか、WSUS管理者に承認依頼
0x80070005(アクセス拒否) 管理者権限不足 SYSTEMアカウントまたは管理者として実行
0x80244022(WU_E_PT_HTTP_STATUS_SERVICE_UNAVAIL) ネットワーク・プロキシ問題 VPN接続確認、プロキシ設定を確認
タスクが実行されない SYSTEMアカウントで実行権限がない /ru SYSTEM /rl highestを確認
インストール後も更新が残る 再起動待ちの更新がある Get-WURebootStatusで確認し再起動
EDR製品がブロック セキュリティソフトが更新をブロック EDR除外設定にスクリプトパスを追加
SoftwareDistributionフォルダが破損 WUキャッシュの破損 net stop wuauservC:\Windows\SoftwareDistributionを削除→net start wuauserv

Windows Updateコンポーネントのリセット

wu-reset.bat – WUコンポーネントリセット
@echo off
echo Windows Updateコンポーネントをリセットします

rem サービス停止
net stop wuauserv    >nul 2>&1
net stop cryptsvc   >nul 2>&1
net stop bits       >nul 2>&1
net stop msiserver  >nul 2>&1

rem キャッシュを削除
rd /s /q C:\Windows\SoftwareDistribution >nul 2>&1
rd /s /q C:\Windows\System32\catroot2     >nul 2>&1

rem DLLを再登録
regsvr32 /s wuapi.dll
regsvr32 /s wuaueng.dll
regsvr32 /s wucltux.dll
regsvr32 /s wups.dll
regsvr32 /s wups2.dll

rem サービス再起動
net start wuauserv   >nul 2>&1
net start cryptsvc   >nul 2>&1
net start bits       >nul 2>&1
net start msiserver  >nul 2>&1

echo リセット完了。再度Windows Updateを試してください。

まとめ

本記事では、バッチファイルでWindows Updateを自動実行するための3つのアプローチを解説しました。

本記事のポイントまとめ

  • UsoClientはWindows 10/11標準搭載で追加インストール不要。ScanInstallWaitで同期実行も可能
  • wuaucltはWindows 7〜10対応の旧来ツール。Win11では機能制限あり
  • PSWindowsUpdateはフィルタリング・ログ・WSUS対応など本格的な自動化に最適
  • 再起動は-AutoReboot/-IgnoreReboot/-ScheduleRebootで環境に合わせて制御する
  • タスクスケジューラへの登録はschtasksコマンドで管理者権限(SYSTEM + highest)で行う
  • WSUS環境では-UseWUServerで経由先を切り替えられる
  • トラブル時はWUコンポーネントのリセットバッチとイベントログが有効

用途に合わせてアプローチを選択し、タスクスケジューラへの登録と組み合わせることで、Windows Updateの完全自動化が実現します。月次パッチ適用テンプレートをベースに、自社環境のポリシー(再起動時間・除外更新・通知先)に合わせてカスタマイズして活用してください。