Windows Updateを自動実行できるようにしておくと、定期メンテナンスやキッティングの手間を大幅に減らせます。バッチファイル単体でも実行できますが、現行のWindows 10/11ではPowerShell経由の制御が実用的です。本記事では管理者権限での実行を前提に、UsoClientとwuaucltによる最小構成、PowerShellモジュール(PSWindowsUpdate)をバッチから呼び出す実運用パターン、タスクスケジューラ登録までを順に解説します。
前提と方針
Windows Updateの裏側はバージョンによってAPIやコマンドの挙動が異なります。Windows 10/11ではUsoClientが、古い環境ではwuaucltが使われますが、企業ポリシーやサービス構成により反応しないこともあります。確実性を高めるにはPowerShellのPSWindowsUpdateモジュールを使い、スキャン、ダウンロード、インストール、再起動まで一気通貫で制御するのが現実的です。いずれの方法も管理者権限での実行が必須であり、UACの昇格を済ませてから実施してください。
最小構成:UsoClient / wuaucltを叩くバッチ
UsoClientはWindows 10以降に搭載される更新オーケストレーターのフロントです。StartScan、StartDownload、StartInstallの順に呼び出します。うまく動かない環境ではwuaucltを併記し、サービスが停止していないかも合わせて確認します。
@echo off
setlocal
rem 管理者で実行していることが前提
rem Windows Updateサービスの起動を確認
sc query wuauserv | find "RUNNING" >nul || (
echo Starting Windows Update service...
net start wuauserv
)
rem UsoClientでスキャン→ダウンロード→インストール
echo [UsoClient] Scan...
UsoClient StartScan 2>nul
echo [UsoClient] Download...
UsoClient StartDownload 2>nul
echo [UsoClient] Install...
UsoClient StartInstall 2>nul
rem 互換用のwuauclt(古い環境向け)
echo [wuauclt] DetectNow...
wuauclt /detectnow
echo [wuauclt] ReportNow...
wuauclt /reportnow
echo Done. 必要に応じて再起動を検討してください。
endlocal
pause
UsoClientは出力が少なく、成功可否の判定が難点です。実行後に再度スキャンし、未適用があるかPowerShell等で確認する運用が安全です。
実用構成:バッチからPowerShellのPSWindowsUpdateを呼び出す
PSWindowsUpdateはWindows Updateをスクリプトで細かく制御できる定番モジュールです。バッチはあくまでランチャーとして振る舞い、PowerShell側でスキャン、インストール、再起動のフローを実行します。初回はモジュールの導入が必要ですが、バッチ内で自動インストールするようにしておくと配布が簡単です。
@echo off
setlocal
rem 管理者で実行していることが前提。PowerShell実行ポリシーはプロセス限定で緩和。
set "PS=powershell -NoProfile -ExecutionPolicy Bypass"
rem Windows Update サービスを起動
sc query wuauserv | find "RUNNING" >nul || net start wuauserv
rem PowerShellスクリプトをその場で実行
%PS% ^
"try { ^
if (-not (Get-Module -ListAvailable PSWindowsUpdate)) { ^
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force | Out-Null; ^
Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted; ^
Install-Module PSWindowsUpdate -Force -SkipPublisherCheck; ^
} ^
Import-Module PSWindowsUpdate; ^
Write-Host 'Scanning updates...' ; ^
$updates = Get-WindowsUpdate -MicrosoftUpdate -IgnoreUserInput -AcceptAll -Verbose; ^
if ($updates) { ^
Write-Host 'Installing updates...'; ^
Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -AutoReboot -IgnoreReboot -Verbose | Out-String | Tee-Object -FilePath '%~dp0wu_install.log'; ^
Write-Host 'Install queued. Reboot may be required.'; ^
} else { ^
Write-Host 'No updates found.'; ^
} ^
} catch { ^
Write-Error $_; exit 1 ^
}"
if errorlevel 1 (
echo 失敗しました。wu_install.log を確認してください。
) else (
echo 完了しました。必要なら手動で再起動してください。
)
endlocal
pause
このスクリプトはモジュールの存在を確認して未導入なら自動で導入し、Microsoft Update経由を含めてスキャンとインストールを実行します。ログはバッチと同じフォルダに出力されるため、トラブル時の切り分けに使えます。企業環境でインターネット接続やPSGalleryが制限されている場合は、モジュールを事前に配布するか内部レポジトリを用意してください。
再起動ポリシーと安全設計
Install-WindowsUpdateの-AutoRebootは更新の種類によっては即時再起動を発生させます。夜間バッチや保守時間外での実行に限定するか、-IgnoreRebootを組み合わせて再起動は別バッチに切り出すのが安全です。サーバーや業務端末では、作業前にログオンユーザーの有無や稼働プロセスを確認し、必要なら警告表示や延期ロジックを入れてください。
結果確認とログ収集
PSWindowsUpdateはGet-WindowsUpdateで未適用の一覧を、Install-WindowsUpdateで適用結果を取得できます。バッチ側では終了コードだけだと情報が乏しいため、PowerShell出力をファイルにTeeし、失敗時はイベントログのWindowsUpdateClientとSetupのチャネルも採取すると復旧が早くなります。
@echo off
setlocal
set "PS=powershell -NoProfile -ExecutionPolicy Bypass"
%PS% "Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -Max 200 | Format-Table -Auto" > "%~dp0wu_event.txt"
echo 直近のイベントを wu_event.txt に保存しました。
endlocal
タスクスケジューラに登録して定期実行する
月例パッチや週次の確認タスクはschtasksで登録できます。次の例では毎週土曜の深夜2時に本バッチを管理者権限で実行します。実行アカウントは更新権限を持つ管理者に設定してください。
@echo off
setlocal
set "TASK=WinUpdate-Auto"
set "BAT=%~dp0run_windows_update.bat"
schtasks /Create /TN "%TASK%" /TR "\"%BAT%\"" /SC WEEKLY /D SAT /ST 02:00 /RU "DOMAIN\UpdateAdmin" /RL HIGHEST /F
echo タスクを登録しました。タスクスケジューラで確認してください。
endlocal
トラブル対処の勘所
サービスが停止している、グループポリシーでWindows UpdateがWSUS固定になっている、メーター接続やVPN要件でダウンロードがブロックされているなど、環境依存の要因が多数あります。WSUS利用時はPSWindowsUpdateの-UseWUServerオプションを有効にし、オフラインカタログを使う場合は事前にCABやmsuを配布してAdd-WUOfflineSyncを検討します。アンチウイルスやEDRがスクリプトをブロックすることもあるため、運用ポリシーと例外設定を整備してから展開してください。
まとめ
Windows Updateの自動実行は、簡易にはUsoClientやwuaucltを叩くバッチで、確実性を求めるならバッチからPSWindowsUpdateを呼ぶ構成が現実的です。管理者権限での実行、スキャンからインストール、再起動の取り扱い、ログの採取、タスクスケジューラでの定期化までを一連のフローとして整えると、端末やサーバーのパッチ適用を安定して運用できます。