「新しいPCを受け取るたびに、Google Chrome・VSCode・7-Zipを1つずつ手動インストールしている」—そんな作業をwingetを使ったバッチ1本で完全自動化できます。
wingetはWindows 10/11に標準搭載されたパッケージマネージャーです。コマンドラインからアプリのインストール・アンインストール・アップデートが行え、バッチファイルと組み合わせることで次のことが実現できます。
- 新PCの初期セットアップを1スクリプトで完全自動化
- 全アプリを一括アップデートして常に最新状態を維持
- インストール済みアプリをJSONにエクスポートして別PCへ環境を複製
- タスクスケジューラと組み合わせた定期自動アップデート
- 差分インストール(未導入のアプリだけを選んでインストール)
本記事ではwingetの基本操作からバッチを使った高度な自動化パターンまで体系的に解説します。
wingetとは
winget(Windows Package Manager)はMicrosoftが開発したオープンソースのパッケージマネージャーです。macOSのbrew、LinuxのApt/YUMに相当するWindowsの公式ツールとして2021年にWindows 11に標準搭載され、Windows 10でも利用可能です。
wingetの特徴をまとめると以下の通りです。
- 無料・公式: Microsoftが開発・メンテナンスするOSS(GitHub公開)
- 大規模リポジトリ: 2025年時点で数万件以上のパッケージが登録済み
- サイレントインストール対応:
--silentオプションでUIなしの自動インストールが可能 - エクスポート/インポート: 環境を丸ごとJSONで保存・復元できる
- Microsoft Storeアプリにも対応: ストアアプリもコマンドラインから管理可能
対応バージョンと確認方法
| OS | wingetの状態 |
|---|---|
| Windows 11 | 標準搭載(初期状態でインストール済み) |
| Windows 10 1709以降 | Microsoft Storeの「アプリインストーラー」として提供 |
| Windows 10 1709未満 | 非対応 |
:: wingetがインストールされているか確認 winget --version :: 出力例: v1.9.25200 :: コマンドが見つからない場合は Microsoft Store で「アプリインストーラー」を更新
方法1: Microsoft Storeを開く → 「アプリインストーラー」を検索 → 「更新」または「入手」
方法2: GitHubの winget-cli releases ページから最新の
.msixbundleをダウンロードして実行企業環境: グループポリシーでMicrosoft Storeが無効になっている場合はIT管理者に確認
パッケージソースの種類と違い
wingetは複数の「ソース(リポジトリ)」からパッケージを取得します。
| ソース名 | 内容 | 主な用途 |
|---|---|---|
winget |
Microsoft公式のwingetリポジトリ(winget-pkgs) | 一般的なデスクトップアプリ |
msstore |
Microsoft Storeのアプリ | UWPアプリ・ストアアプリ |
:: 登録済みソース一覧 winget source list :: ソースを更新(キャッシュ最新化) winget source update :: ソースをリセット(更新できない場合に試す) winget source reset --force :: 特定のソースからのみ検索 winget search chrome --source winget winget search chrome --source msstore
wingetの主要コマンド一覧
| コマンド | 内容 |
|---|---|
winget search キーワード |
パッケージを検索する |
winget show パッケージID |
パッケージの詳細情報を表示 |
winget install パッケージID |
パッケージをインストール |
winget uninstall パッケージID |
パッケージをアンインストール |
winget upgrade |
アップデート可能なパッケージ一覧を表示 |
winget upgrade --all |
すべてのパッケージをアップデート |
winget upgrade パッケージID |
特定のパッケージのみアップデート |
winget list |
インストール済みパッケージ一覧を表示 |
winget export -o ファイル.json |
インストール済みリストをJSONに書き出す |
winget import -i ファイル.json |
JSONのリストから一括インストール |
winget pin add パッケージID |
パッケージをバージョン固定(自動アップデート除外) |
winget pin list |
ピン留め一覧を表示 |
winget pin remove パッケージID |
ピン留めを解除 |
winget source list |
登録済みパッケージソース一覧 |
winget source update |
ソースのキャッシュを更新 |
winget settings |
設定ファイル(JSON)をエディタで開く |
winget hash ファイルパス |
ファイルのSHA256ハッシュを計算 |
インストール時によく使うオプション
| オプション | 内容 |
|---|---|
-e, --exact |
パッケージIDを完全一致で検索(曖昧一致を無効化) |
-h, --silent |
サイレントインストール(UIなし) |
--accept-package-agreements |
ライセンス規約に自動同意 |
--accept-source-agreements |
ソース規約に自動同意 |
-l, --location パス |
インストール先ディレクトリを指定 |
-v, --version バージョン |
インストールするバージョンを指定 |
--scope machine |
全ユーザー向けにインストール(要管理者権限) |
--scope user |
現在のユーザーのみにインストール |
-o, --log ファイル |
インストールログをファイルに保存 |
--force |
インストール済みでも強制的に再インストール |
--include-unknown |
バージョン不明のパッケージもアップグレード対象に含める |
-e --silent --accept-package-agreements --accept-source-agreementsの4つのオプションを組み合わせることで、確認ダイアログなしの完全サイレントインストールが実現できます。バッチから自動化する際はこの組み合わせが基本です。パッケージIDの確認方法
インストールコマンドにはパッケージID(例: Google.Chrome)を使います。キーワードで検索して正確なIDを確認してからスクリプトに記述してください。
:: キーワードでパッケージを検索 winget search chrome :: 出力例: :: 名前 ID バージョン :: --------------------------------------------------------- :: Google Chrome Google.Chrome 131.0.6778.86 :: Chromium Hibbiki.Chromium ... :: 完全一致で検索(ID候補を絞り込む) winget search --exact --id Google.Chrome :: 詳細情報の確認(インストーラーの種類・利用規約など) winget show Google.Chrome
よく使うアプリのパッケージID一覧
| アプリ名 | パッケージID |
|---|---|
| Google Chrome | Google.Chrome |
| Mozilla Firefox | Mozilla.Firefox |
| Visual Studio Code | Microsoft.VisualStudioCode |
| 7-Zip | 7zip.7zip |
| Zoom | Zoom.Zoom |
| Slack | SlackTechnologies.Slack |
| Git for Windows | Git.Git |
| Node.js(LTS) | OpenJS.NodeJS.LTS |
| Python 3.12 | Python.Python.3.12 |
| Docker Desktop | Docker.DockerDesktop |
| WinSCP | WinSCP.WinSCP |
| Notepad++ | Notepad++.Notepad++ |
| VLC | VideoLAN.VLC |
| Adobe Acrobat Reader DC | Adobe.Acrobat.Reader.64-bit |
| Microsoft Teams | Microsoft.Teams |
| PowerToys | Microsoft.PowerToys |
| Wireshark | WiresharkFoundation.Wireshark |
| Greenshot | Greenshot.Greenshot |
| Everything(ファイル検索) | voidtools.Everything |
| Windows Terminal | Microsoft.WindowsTerminal |
| OBS Studio | OBSProject.OBSStudio |
| AutoHotkey | AutoHotkey.AutoHotkey |
| Postman | Postman.Postman |
| Java(Adoptium JDK 21) | EclipseAdoptium.Temurin.21.JDK |
インストール・アンインストール・アップデートの基本
インストール
@echo off :: 基本インストール(UIが表示される場合あり) winget install Google.Chrome :: サイレントインストール(バッチ自動化の基本形) winget install -e --id Google.Chrome --silent --accept-package-agreements --accept-source-agreements :: バージョン指定インストール winget install -e --id Google.Chrome --version 120.0.6099.130 --silent :: インストール先を指定(対応しているインストーラーのみ) winget install -e --id Notepad++.Notepad++ --location "C:\Tools\Notepad++" :: 全ユーザー向けインストール(要管理者権限) winget install -e --id 7zip.7zip --scope machine --silent :: インストール結果をログに保存 winget install -e --id Git.Git --silent --log "C:\logs\git_install.txt"
アンインストール
@echo off :: パッケージIDで指定してアンインストール winget uninstall -e --id Google.Chrome --silent :: 表示名で指定してアンインストール winget uninstall --name "Google Chrome" --silent :: 全ユーザー向けインストール分をアンインストール winget uninstall -e --id Google.Chrome --scope machine
アップデート
@echo off :: アップデート可能なパッケージ一覧を表示 winget upgrade :: 特定のアプリだけアップデート winget upgrade -e --id Google.Chrome --silent --accept-package-agreements :: 全パッケージを一括アップデート winget upgrade --all --silent --accept-package-agreements --accept-source-agreements :: バージョン不明のアプリも含めてアップデート winget upgrade --all --include-unknown --silent --accept-package-agreements
wingetの終了コードとエラー処理
wingetの終了コードは%errorlevel%で取得できます。バッチから自動化する場合はこれを使って成否を判定してください。
| 終了コード(16進数) | 10進数 | 意味 |
|---|---|---|
| 0x0 | 0 | 成功 |
| 0x8A150011(-1978335215) | -1978335215 | ソースが合意済みでない(--accept-source-agreementsを追加) |
| 0x8A150021(-1978335199) | -1978335199 | パッケージの規約に未同意(--accept-package-agreementsを追加) |
| 0x8A150049(-1978335159) | -1978335159 | インストーラーのダウンロードに失敗 |
| 0x8A15002B(-1978335189) | -1978335189 | 別のバージョンがすでにインストール済み |
| 0x8A15007D(-1978335107) | -1978335107 | 対象パッケージが見つからない |
| 0xA15002(10571778) | 10571778 | パッケージのハッシュが一致しない |
| 0x8A150077(-1978335113) | -1978335113 | 管理者権限が必要 |
wingetの終了コードは負の値(int32の範囲外)を返すことがあります。バッチの
%errorlevel%はこれを正しく扱えない場合があります。確実なエラー判定にはif %errorlevel% neq 0で「0以外」をエラーとして扱うか、あるいはwineget実行後にwinget list -e --id パッケージIDで実際にインストールされているかを確認する方が確実です。@echo off
setlocal enabledelayedexpansion
set PKG=Google.Chrome
:: インストール実行
winget install -e --id %PKG% --silent --accept-package-agreements --accept-source-agreements
set RESULT=%errorlevel%
if %RESULT% equ 0 (
echo [OK] %PKG% インストール成功
goto :eof
)
:: エラー種別を判定
:: wingetの終了コードは負値を返すため neq 0 で包括的に検知
echo [警告] %PKG% のインストールで問題が発生しました(コード: %RESULT%)
:: インストール済みかを事後確認
winget list -e --id %PKG% --accept-source-agreements >nul 2>&1
if !errorlevel! equ 0 (
echo [INFO] %PKG% はすでにインストール済みです(コード無視)
) else (
echo [ERROR] %PKG% のインストールに失敗しました。
)
バージョンのピン留め(固定)
winget upgrade --allを実行しても自動アップデートさせたくないアプリがある場合、ピン留め(pin)でバージョンを固定できます。互換性の理由で特定バージョンを維持したい場合に有効です。
@echo off :: Chromeを130系に固定(マイナーアップデートは許容) winget pin add -e --id Google.Chrome --version 130.* :: バージョンを完全固定 winget pin add -e --id Mozilla.Firefox --version 120.0 :: ピン留め一覧を表示 winget pin list :: ピン留めを解除 winget pin remove -e --id Google.Chrome :: upgrade --allを実行してもピン留め分はスキップされる winget upgrade --all --silent --accept-package-agreements
インストール済みアプリ一覧の管理
一覧の表示・確認
@echo off
:: インストール済みパッケージ一覧
winget list
:: テキストファイルに出力
winget list > "C:\logs\installed_apps_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt"
:: 特定のアプリが入っているか確認
winget list -e --id Google.Chrome --accept-source-agreements >nul 2>&1
if %errorlevel% equ 0 (
echo Chrome はインストール済みです。
) else (
echo Chrome はインストールされていません。
)
:: winget管理外のアプリも含め全アプリを確認したい場合
winget list --source winget
エクスポート(バックアップ)とインポート(別PCへの複製)
現在のインストール済みアプリリストをJSONファイルに保存し、別のPCで同じ環境を再現できます。
@echo off :: エクスポート: winget管理アプリリストをJSONに保存 winget export -o "C:\backup\winget_apps_%COMPUTERNAME%_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.json" echo エクスポート完了。 :: インポート: JSONのリストからすべてのアプリをインストール :: winget import -i "C:\backup\winget_apps.json" --accept-package-agreements --accept-source-agreements
{
"$schema": "https://aka.ms/winget-packages.schema.2.0.json",
"CreationDate": "2025-01-01T00:00:00.000-00:00",
"Sources": [
{
"Packages": [
{ "PackageIdentifier": "Google.Chrome" },
{ "PackageIdentifier": "Microsoft.VisualStudioCode" },
{ "PackageIdentifier": "7zip.7zip" }
],
"SourceDetails": {
"Argument": "https://cdn.winget.microsoft.com/cache",
"Name": "winget",
"Type": "Microsoft.PreIndexed.Package"
}
}
],
"WinGetVersion": "1.9.25200"
}
wingetの設定ファイル(winget settings)
winget settingsを実行するとJSONの設定ファイルが開きます。テレメトリーのオフや動作のカスタマイズが可能です。
{
"$schema": "https://aka.ms/winget-settings.schema.json",
"telemetry": {
"disable": true
},
"installBehavior": {
"preferences": {
"scope": "machine"
}
},
"network": {
"downloader": "wininet"
}
}
| 設定項目 | 内容 |
|---|---|
telemetry.disable: true |
Microsoftへの利用状況データ送信を無効化 |
installBehavior.preferences.scope: "machine" |
デフォルトのインストールスコープを全ユーザー向けに設定 |
network.downloader: "wininet" |
ネットワークダウンローダーをWinINetに変更(プロキシ環境での問題解決に有効) |
企業環境(プロキシ)でのwinget設定
企業のプロキシ環境でwingetのダウンロードが失敗する場合、Windowsのシステムプロキシ設定が引き継がれるため、まずシステムプロキシが正しく設定されているか確認します。
@echo off
:: システムプロキシ設定の確認
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" ^^
/v ProxyEnable
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings" ^^
/v ProxyServer
:: プロキシ経由でwingetを使う場合
:: (Windowsのシステムプロキシが設定されていれば自動で引き継がれる)
winget install Google.Chrome --silent --accept-package-agreements
:: プロキシ経由でもダウンロードできない場合は設定ファイルで downloader を変更
:: winget settings → "network": {"downloader": "wininet"} を追加
①Windowsのシステムプロキシ設定を確認・修正 → ②
winget settingsでnetwork.downloader: "wininet"を設定 → ③それでも失敗する場合はIT管理者にwingetの通信先(cdn.winget.microsoft.com)の許可を申請新PCセットアップ自動化スクリプト
会社のPC展開・個人の環境整備など、新しいPCに必要なアプリを一括インストールするシナリオです。
@echo off
setlocal enabledelayedexpansion
:: ==========================================
:: 新PC初期セットアップ - アプリ一括インストール
:: 管理者権限で実行すること
:: ==========================================
set LOG=C:\logs\setup_%COMPUTERNAME%_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
if not exist C:\logs mkdir C:\logs
echo 新PCセットアップ開始: %DATE% %TIME% > "%LOG%"
echo PC: %COMPUTERNAME% / User: %USERNAME% >> "%LOG%"
:: wingetソースを最新化
echo [事前準備] ソース更新中... >> "%LOG%"
winget source update >> "%LOG%" 2>&1
:: インストールするパッケージリスト
set PACKAGES=^
Google.Chrome ^
Mozilla.Firefox ^
Microsoft.VisualStudioCode ^
7zip.7zip ^
WinSCP.WinSCP ^
Notepad++.Notepad++ ^
Microsoft.PowerToys ^
Git.Git
set SUCCESS_COUNT=0
set FAIL_COUNT=0
for %%p in (%PACKAGES%) do (
echo.
echo [インストール中] %%p
echo [%%p] インストール開始 >> "%LOG%"
winget install -e --id %%p --silent --accept-package-agreements ^^
--accept-source-agreements >> "%LOG%" 2>&1
:: インストール後の事後確認(終了コードより確実)
winget list -e --id %%p --accept-source-agreements >nul 2>&1
if !errorlevel! equ 0 (
echo [OK] %%p >> "%LOG%"
echo OK: %%p
set /a SUCCESS_COUNT+=1
) else (
echo [NG] %%p >> "%LOG%"
echo NG: %%p
set /a FAIL_COUNT+=1
)
)
echo. >> "%LOG%"
echo 成功: %SUCCESS_COUNT%件 / 失敗: %FAIL_COUNT%件 >> "%LOG%"
echo 完了: %DATE% %TIME% >> "%LOG%"
echo.
echo ==========================================
echo セットアップ完了
echo 成功: !SUCCESS_COUNT!件 / 失敗: !FAIL_COUNT!件
echo ログ: %LOG%
echo ==========================================
--scope machine(全ユーザー向けインストール)を使う場合は管理者権限が必要です。バッチファイルで管理者権限を自動取得する方法と組み合わせることで、ダブルクリックで自動昇格させることができます。定期自動アップデートスクリプト
タスクスケジューラと組み合わせて、毎週日曜の深夜に全アプリを自動アップデートするパターンです。
@echo off
setlocal
set LOG=C:\logs\winget_update_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
if not exist C:\logs mkdir C:\logs
(
echo === winget 自動アップデート ===
echo 日時: %DATE% %TIME%
echo PC: %COMPUTERNAME%
) > "%LOG%"
:: ソースを更新してから実行
winget source update >> "%LOG%" 2>&1
:: アップデート前のリストを記録
echo [アップデート可能] >> "%LOG%"
winget upgrade >> "%LOG%" 2>&1
:: 全パッケージを一括アップデート
echo [アップデート実行] >> "%LOG%"
winget upgrade --all --silent --accept-package-agreements --accept-source-agreements >> "%LOG%" 2>&1
echo 終了コード: %errorlevel% >> "%LOG%"
echo アップデート完了: %DATE% %TIME% >> "%LOG%"
echo winget自動アップデート完了: %LOG%
@echo off
:: 毎週日曜 03:00 に自動アップデートを実行
set SCRIPT=%~dp0auto_update.bat
schtasks /create /tn "WingetAutoUpdate" ^^
/tr "cmd /c \"%SCRIPT%\"" ^^
/sc WEEKLY /d SUN /st 03:00 ^^
/ru SYSTEM ^^
/f
if %errorlevel% equ 0 (
echo タスク「WingetAutoUpdate」を登録しました
) else (
echo 登録失敗(管理者権限で実行してください)
)
実践パターン
パターン1: 差分インストール(未導入分だけをインストール)
必要なアプリが揃っているか確認し、不足分だけをインストールするパターンです。同じスクリプトを何度実行しても冪等性(同じ結果になること)が保てます。
@echo off
setlocal enabledelayedexpansion
:: 必須アプリのリスト
set REQUIRED=Google.Chrome 7zip.7zip WinSCP.WinSCP Notepad++.Notepad++
set INSTALL_COUNT=0
for %%p in (%REQUIRED%) do (
winget list -e --id %%p --accept-source-agreements >nul 2>&1
if !errorlevel! neq 0 (
echo [未インストール] %%p をインストールします...
winget install -e --id %%p --silent --accept-package-agreements --accept-source-agreements
set /a INSTALL_COUNT+=1
) else (
echo [インストール済み] %%p
)
)
if !INSTALL_COUNT! equ 0 (
echo すべての必須アプリがインストール済みです。
) else (
echo !INSTALL_COUNT!件のアプリをインストールしました。
)
パターン2: 環境エクスポート → 別PC復元ワークフロー
PC移行時に現在の環境を保存し、新しいPCで完全復元するパターンです。
@echo off :: 旧PCで実行: 現在の環境をバックアップ set BACKUP_DIR=D:\Backup\Environment if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%" :: wingetアプリリストをJSON形式でエクスポート winget export -o "%BACKUP_DIR%\winget_apps.json" echo アプリリストを保存: %BACKUP_DIR%\winget_apps.json :: winget管理外も含む全アプリ一覧をテキストに保存(参考用) winget list > "%BACKUP_DIR%\all_installed_apps.txt" echo 全アプリ一覧を保存: %BACKUP_DIR%\all_installed_apps.txt echo バックアップ完了。%BACKUP_DIR% を新PCにコピーしてください。
@echo off
:: 新PCで実行: バックアップから環境を復元
set JSON=D:\Backup\Environment\winget_apps.json
if not exist "%JSON%" (
echo バックアップファイルが見つかりません: %JSON%
exit /b 1
)
echo アプリの復元を開始します...
winget import -i "%JSON%" --accept-package-agreements --accept-source-agreements
if %errorlevel% equ 0 (
echo 復元完了。
) else (
echo 一部アプリの復元に失敗した可能性があります。
echo winget list で確認してください。
)
パターン3: 特定カテゴリのアプリを一括アンインストール
不要になったアプリをリストで管理して一括削除するパターンです。端末クリーンアップや引き渡し前の整理に有効です。
@echo off
setlocal enabledelayedexpansion
set REMOVE_LIST=Zoom.Zoom SlackTechnologies.Slack Microsoft.Teams
set COUNT=0
for %%p in (%REMOVE_LIST%) do (
winget list -e --id %%p --accept-source-agreements >nul 2>&1
if !errorlevel! equ 0 (
echo [アンインストール中] %%p
winget uninstall -e --id %%p --silent
set /a COUNT+=1
) else (
echo [スキップ] %%p は未インストール
)
)
echo !COUNT!件のアプリをアンインストールしました。
パターン4: 企業PC部署別セットアップ(ログを共有フォルダに保存)
部署ごとに必要なアプリが異なる企業PC展開シナリオです。引数で部署を指定するとそれぞれ必要なアプリをインストールし、共有フォルダに結果ログを保存することで管理者が一元確認できます。
@echo off
setlocal enabledelayedexpansion
:: 使い方: enterprise_setup.bat [/general|/dev|/design]
set DEPT=%1
if "%DEPT%"=="" set DEPT=/general
set SHARE_LOG=\\fileserver\setup_logs
set DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set LOG=C:\logs\setup_%COMPUTERNAME%_%DATE_STR%.txt
if not exist C:\logs mkdir C:\logs
echo [セットアップ開始] PC: %COMPUTERNAME% / 部署: %DEPT% > "%LOG%"
:: 全PC共通アプリ
set APPS=Google.Chrome 7zip.7zip Microsoft.PowerToys
:: 開発部門向け追加
if /i "%DEPT%"=="/dev" (
set APPS=%APPS% Microsoft.VisualStudioCode Git.Git OpenJS.NodeJS.LTS
)
:: デザイン部門向け追加
if /i "%DEPT%"=="/design" (
set APPS=%APPS% VideoLAN.VLC Greenshot.Greenshot
)
set OK=0
set NG=0
for %%p in (%APPS%) do (
winget install -e --id %%p --silent --accept-package-agreements ^^
--accept-source-agreements >> "%LOG%" 2>&1
winget list -e --id %%p --accept-source-agreements >nul 2>&1
if !errorlevel! equ 0 (
echo [OK] %%p >> "%LOG%"
set /a OK+=1
) else (
echo [NG] %%p >> "%LOG%"
set /a NG+=1
)
)
echo 成功: !OK! / 失敗: !NG! >> "%LOG%"
:: 共有フォルダにログをコピー
if exist "%SHARE_LOG%" (
copy "%LOG%" "%SHARE_LOG%\" >nul
)
echo セットアップ完了: 成功 !OK!件 / 失敗 !NG!件
winget list と wmic の使い分け
インストール済みアプリの確認にはwinget listとwmicコマンドのwmic product getの両方が使えます。
| 項目 | winget list | wmic product get |
|---|---|---|
| 表示対象 | winget管理パッケージ + MSI製品(部分的) | Windowsインストーラー(MSI)で導入された全製品 |
| 実行速度 | 高速(数秒〜10秒) | 低速(30秒〜1分以上) |
| Microsoft Storeアプリ | 表示される | 表示されない場合が多い |
| インストール操作 | 直接操作可能 | 情報取得のみ |
| 推奨用途 | winget管理アプリの確認・操作 | MSIインストーラー製品の網羅的な確認 |
「winget listに出ないがwmicでは見える」アプリは、MSIインストーラーはあるがwingetリポジトリ未登録のものです。このようなアプリはwingetでは管理できないため、個別に手動でアップデートが必要です。
よくある問題と対処
| 問題・エラー | 原因 | 対処 |
|---|---|---|
| 「winget」は認識されていないコマンドです | wingetが未インストールまたは古いバージョン | Microsoft Storeの「アプリインストーラー」を更新する |
| インストールがUACダイアログで止まる | 管理者権限が必要なアプリをサイレントインストール | バッチを管理者として実行するか、--scope userでユーザーインストールを試みる |
| 「別のバージョンがすでにインストールされています」 | 旧バージョンが既存インストール済み | winget upgrade -e --id パッケージIDを使う |
| 「ソースが見つかりません」 | ソースキャッシュが古いまたは無効 | winget source updateでソースを更新する。それでも失敗する場合はwinget source reset --force |
一部のアプリが--silentでインストールできない |
インストーラーがサイレントモード非対応 | --accept-package-agreementsを追加するか、対応インストーラーが別のパッケージIDで存在しないか確認する |
winget upgrade --allで一部がスキップされる |
バージョン情報不一致またはピン留め | winget pin listでピン留めを確認。スキップされるアプリは個別にwinget upgrade --id パッケージIDを試みる |
| プロキシ環境でインストールに失敗する | プロキシ経由のHTTPS通信がブロックされている | Windowsのシステムプロキシ設定を確認。またはwinget settingsでnetwork.downloader: "wininet"を設定する |
よくある質問
--silentが効かない場合があります。wingetにないアプリはChocolateyなど別のパッケージマネージャーとの併用も検討してください。winget search アプリ名で最新のIDを確認してからスクリプトに記述してください。スクリプト内のIDは定期的な見直しが必要です。winget pin add -e --id パッケージID --version バージョンでピン留めできます。--version 130.*のようにワイルドカードも使用可能です。winget upgrade --allを実行してもピン留めされたパッケージはスキップされます。--scope machine(全ユーザー向け)には管理者権限が必要。④企業のソフトウェアポリシーによってはwingetによる自由なインストールが禁止されている場合があるため、IT部門に確認する。wingetコマンドはそのまま使えます。PowerShellスクリプト(.ps1)から呼ぶ場合はwinget install ...と直接呼び出せます。終了コードは$LASTEXITCODEで取得します。PSWindowsUpdateモジュールやusoclient.exe StartScanコマンドで制御できます。ただしこれらは非公式な方法のため本番環境での利用は慎重に検討してください。wmic product getを補完的に使います。まとめ
wingetとバッチファイルを組み合わせることで、新PCのセットアップから日常的なアプリ管理まで大幅に効率化できます。
本記事のポイントをまとめます。
- サイレントインストールの基本形:
winget install -e --id パッケージID --silent --accept-package-agreements --accept-source-agreements - 一括インストール:
for %%p in (ID1 ID2 ...)のループで複数パッケージを順次処理。事後確認で冪等性を確保 - 環境の複製:
winget exportでJSONを保存 →winget importで別PCに復元 - バージョン固定:
winget pin addでピン留め →--allアップデートから除外 - 定期自動アップデート:
winget upgrade --all --silentをタスクスケジューラで定期実行 - 終了コードより事後確認が確実: インストール後に
winget list -e --idで実際の状態を確認する - ログは必ず残す:
--logオプションまたはリダイレクトで結果をファイルに保存しログ管理と組み合わせる

