【bat】wingetコマンド完全ガイド|新PCセットアップ自動化・一括インストール・アップデート・アンインストールをバッチで完全管理

【bat】wingetコマンド完全ガイド|新PCセットアップ自動化・一括インストール・アップデート・アンインストールをバッチで完全管理 bat

「新しい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 で「アプリインストーラー」を更新
wingetが使えない場合の対処
方法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を確認してからスクリプトに記述してください。

パッケージ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

インストール・アンインストール・アップデートの基本

インストール

winget_install_basic.bat
@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"

アンインストール

winget_uninstall.bat
@echo off
:: パッケージIDで指定してアンインストール
winget uninstall -e --id Google.Chrome --silent

:: 表示名で指定してアンインストール
winget uninstall --name "Google Chrome" --silent

:: 全ユーザー向けインストール分をアンインストール
winget uninstall -e --id Google.Chrome --scope machine

アップデート

winget_upgrade.bat
@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で実際にインストールされているかを確認する方が確実です。
winget_with_error_handling.bat
@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)でバージョンを固定できます。互換性の理由で特定バージョンを維持したい場合に有効です。

winget_pin.bat
@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

インストール済みアプリ一覧の管理

一覧の表示・確認

winget_list.bat
@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で同じ環境を再現できます。

winget_export_import.bat
@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
winget_export_sample.json
{
  "$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の設定ファイルが開きます。テレメトリーのオフや動作のカスタマイズが可能です。

winget_settings_sample.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のシステムプロキシ設定が引き継がれるため、まずシステムプロキシが正しく設定されているか確認します。

proxy_check.bat
@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 settingsnetwork.downloader: "wininet"を設定 → ③それでも失敗する場合はIT管理者にwingetの通信先(cdn.winget.microsoft.com)の許可を申請

新PCセットアップ自動化スクリプト

会社のPC展開・個人の環境整備など、新しいPCに必要なアプリを一括インストールするシナリオです。

new_pc_setup.bat
@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(全ユーザー向けインストール)を使う場合は管理者権限が必要です。バッチファイルで管理者権限を自動取得する方法と組み合わせることで、ダブルクリックで自動昇格させることができます。

定期自動アップデートスクリプト

タスクスケジューラと組み合わせて、毎週日曜の深夜に全アプリを自動アップデートするパターンです。

auto_update.bat
@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%
register_auto_update.bat
@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: 差分インストール(未導入分だけをインストール)

必要なアプリが揃っているか確認し、不足分だけをインストールするパターンです。同じスクリプトを何度実行しても冪等性(同じ結果になること)が保てます。

check_and_install.bat
@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で完全復元するパターンです。

backup_env.bat
@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にコピーしてください。
restore_env.bat
@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: 特定カテゴリのアプリを一括アンインストール

不要になったアプリをリストで管理して一括削除するパターンです。端末クリーンアップや引き渡し前の整理に有効です。

bulk_uninstall.bat
@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展開シナリオです。引数で部署を指定するとそれぞれ必要なアプリをインストールし、共有フォルダに結果ログを保存することで管理者が一元確認できます。

enterprise_setup.bat
@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 listwmicコマンド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 settingsnetwork.downloader: "wininet"を設定する

よくある質問

Qwingetで管理できないアプリはありますか?
Aはい。wingetリポジトリに未登録のアプリは管理できません。また、独自インストーラーを使うアプリは--silentが効かない場合があります。wingetにないアプリはChocolateyなど別のパッケージマネージャーとの併用も検討してください。
QwingetのパッケージIDが変わっていた/見つからない場合は?
Awinget-pkgsリポジトリは常に更新されており、IDが変わる場合があります。winget search アプリ名で最新のIDを確認してからスクリプトに記述してください。スクリプト内のIDは定期的な見直しが必要です。
Qwinget upgrade –all を自動実行すると再起動を要求することはありますか?
Aアップデート内容によっては再起動が必要な場合があります。重要なサーバーや業務中のPCへの深夜自動更新でも意図しない再起動が発生しないよう、自動再起動を抑止する設定を合わせて確認してください。
Qwingetで特定バージョンに固定する方法はありますか?
Awinget pin add -e --id パッケージID --version バージョンでピン留めできます。--version 130.*のようにワイルドカードも使用可能です。winget upgrade --allを実行してもピン留めされたパッケージはスキップされます。
Q企業環境でwingetを使う場合の注意点は?
A①グループポリシーでMicrosoft Storeが無効だとwingetが使えない場合がある。②プロキシ環境ではwingetの接続設定が必要な場合がある。③--scope machine(全ユーザー向け)には管理者権限が必要。④企業のソフトウェアポリシーによってはwingetによる自由なインストールが禁止されている場合があるため、IT部門に確認する。
QPowerShellからもwingetを使えますか?
Aはい。PowerShellのターミナルからもwingetコマンドはそのまま使えます。PowerShellスクリプト(.ps1)から呼ぶ場合はwinget install ...と直接呼び出せます。終了コードは$LASTEXITCODEで取得します。
Qwinget で Windows 自体をアップデートすることはできますか?
AwingetでWindowsOSそのもののアップデートはできません。Windows UpdateはPowerShellのPSWindowsUpdateモジュールやusoclient.exe StartScanコマンドで制御できます。ただしこれらは非公式な方法のため本番環境での利用は慎重に検討してください。
Qwinget listで表示されないのにアプリはインストールされています。なぜですか?
Awingetは「wingetが管理しているアプリ」と「Windowsインストーラー(MSI)で導入されたアプリ」を表示します。独自のインストーラーを使ったアプリや、ポータブル版(インストーラーなし)のアプリはwinget listに表示されません。全アプリを確認するにはwmicコマンド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オプションまたはリダイレクトで結果をファイルに保存しログ管理と組み合わせる