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 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を試してください。
まとめ
本記事では、バッチファイルで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の完全自動化が実現します。月次パッチ適用テンプレートをベースに、自社環境のポリシー(再起動時間・除外更新・通知先)に合わせてカスタマイズして活用してください。