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 =%~dp0 wu-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 wuauserv→C:\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を試してください。
よくある質問(FAQ)
Q. バッチファイルからWindows Updateを実行するにはどうすればよいですか?
A. PowerShellのPSWindowsUpdateモジュールまたはWUSAコマンドを使います。PowerShell経由:powershell -Command "Install-WindowsUpdate -AcceptAll -AutoReboot"(PSWindowsUpdateモジュール要インストール)。またはwusa.exe /update /quiet /norestartで特定の更新プログラムを適用できます。
Q. Windows Updateを適用後に自動再起動させないようにするにはどうすればよいですか?
A. wusaコマンドに/norestartオプションを付けます。PowerShellのInstall-WindowsUpdateでは-IgnoreRebootを付けます。ただし、一部の重要な更新は再起動が必要で、/norestartを付けても更新が適用されない場合があります。
Q. Windows Updateのインストール状況(どの更新が適用済みか)をバッチで確認するにはどうすればよいですか?
A. wmic qfe list brief /format:tableでインストール済みの更新プログラム一覧を表示できます。PowerShellではGet-HotFixコマンドが便利です。特定のKBが適用済みかどうかはwmic qfe where "HotFixID='KB5001716'" listで確認できます。
まとめ
本記事では、バッチファイルで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の完全自動化が実現します。月次パッチ適用テンプレートをベースに、自社環境のポリシー(再起動時間・除外更新・通知先)に合わせてカスタマイズして活用してください。
関連するまとめページ