【保存版】Windows Package Manager (winget) チートシート

## はじめに

弊社[株式会社アイティードゥ](https://itdo.jp/)では、これまでWindowsのパッケージ管理に主にChocolatyを使ってきました。Windows Package Manager（winget）への入れ替えを検討して試用を行っています。この記事では、wingetの基本的なコマンドから高度な使い方までを実用的なチートシートとしてまとめました。

Windows Package Manager（winget）Windowsユーザーのためのコマンドラインパッケージマネージャーです。コマンド一つでアプリケーションのインストール、更新、削除ができ、環境構築を効率化できます。

## インストールと確認

### wingetのインストール

wingetはWindows 10 (1709以降) およびWindows 11に標準でインストールされていますが、手動でインストールすることも可能です。

```powershell
# バージョン確認
winget -v

# App Installerが入っていない場合、Microsoft Storeからインストール
# または以下のコマンドでGitHubから最新版をインストール
Invoke-WebRequest -Uri https://github.com/microsoft/winget-cli/releases/latest/download/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle -OutFile winget.msixbundle
Add-AppxPackage -Path winget.msixbundle
Remove-Item winget.msixbundle
```

### VCLibsのインストール（必要な場合）

エラーが発生する場合は、必要なランタイムをインストールします。

```powershell
# x64用のVCLibsをインストール
Invoke-WebRequest -Uri https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx -OutFile vclibs.appx
Add-AppxPackage -Path vclibs.appx
Remove-Item vclibs.appx
```

## 基本コマンド

### 検索と情報表示

```powershell
# アプリケーションの検索
winget search <検索キーワード>

# 例: VSCodeを検索
winget search vscode

# 正確な名前で検索（大文字小文字を区別）
winget search --exact <名前>
winget search -e <名前>

# パッケージの詳細情報を表示
winget show <パッケージID>

# 例: VSCodeの詳細情報
winget show Microsoft.VisualStudioCode

# 特定パッケージの利用可能なバージョンを表示
winget show <パッケージID> --versions
```

### インストール

```powershell
# 名前またはIDを指定してインストール
winget install <アプリ名またはID>

# 例: VSCodeをインストール
winget install Microsoft.VisualStudioCode

# 正確なIDを指定して確実にインストール
winget install --exact --id <パッケージID>
winget install -e -id <パッケージID>

# 特定バージョンをインストール
winget install <パッケージID> --version <バージョン>

# サイレントインストール（ユーザー入力なし）
winget install <パッケージID> --silent
winget install <パッケージID> -h

# インストール先を指定
winget install <パッケージID> --location <パス>
```

### アップグレード

```powershell
# 更新可能なパッケージを一覧表示
winget upgrade

# 特定のパッケージを更新
winget upgrade <パッケージID>

# すべてのパッケージを更新
winget upgrade --all

# 例: VSCodeを更新
winget upgrade Microsoft.VisualStudioCode
```

### アンインストール

```powershell
# パッケージをアンインストール
winget uninstall <パッケージID>

# 例: VSCodeをアンインストール
winget uninstall Microsoft.VisualStudioCode

# サイレントアンインストール
winget uninstall <パッケージID> --silent
```

### インストール済みパッケージの管理

```powershell
# インストール済みパッケージの一覧表示
winget list

# キーワードでインストール済みパッケージをフィルタリング
winget list <検索キーワード>

# 例: インストール済みのMicrosoftアプリを表示
winget list Microsoft
```

## 高度な使い方

### エクスポートとインポート

```powershell
# インストール済みアプリを設定ファイルにエクスポート
winget export -o <出力ファイル名>.json

# バージョン情報を含めてエクスポート
winget export -o <出力ファイル名>.json --include-versions

# 例: 現在の環境をエクスポート
winget export -o my-apps.json

# JSONファイルからアプリをインポート
winget import -i <JSONファイル名>

# 例: エクスポートしたアプリをインポート
winget import -i my-apps.json

# バージョンを無視してインポート（最新版をインストール）
winget import -i <JSONファイル名> --ignore-versions
```

### 設定とカスタマイズ

```powershell
# wingetの設定を開く
winget settings

# 設定の例（settings.jsonの内容）
{
    "experimentalFeatures": {
        "experimentalMSStore": true,
        "experimentalArg": false
    },
    "visual": {
        "progressBar": "accent"
    },
    "installBehavior": {
        "preferences": {
            "scope": "user",
            "locale": ["ja-JP", "en-US"]
        }
    },
    "telemetry": {
        "disable": true
    },
    "network": {
        "downloader": "wininet",
        "doProgressTimeoutInSeconds": 60
    }
}
```

### パッケージリポジトリ（ソース）の管理

```powershell
# 利用可能なパッケージリポジトリ一覧の表示
winget source list

# 新しいパッケージリポジトリの追加
winget source add <リポジトリ名> <リポジトリURL>

# パッケージリポジトリの削除
winget source remove <リポジトリ名>

# パッケージリポジトリ情報の更新
winget source update

# 特定のパッケージリポジトリからアプリを検索
winget search <検索ワード> --source <リポジトリ名>
```

### パッケージのハッシュ検証

```powershell
# インストーラーファイルのハッシュを計算
winget hash <インストーラーファイルのパス>

# 例: セットアップファイルのハッシュを計算
winget hash C:\Downloads\setup.exe
```

### 実験的機能とプレビュー機能

```powershell
# 実験的機能の表示
winget features

# 実験的機能の有効化（settings.jsonで設定）
# "experimentalFeatures": { "featureName": true }
```

## winget configuration（構成管理）

winget 1.6以降の新機能である構成管理機能のコマンドです。

```powershell
# YAML構成ファイルから環境をセットアップ
winget configure <YAMLファイル>

# 例: 開発環境をセットアップ
winget configure dev-environment.dsc.yaml

# 構成の検証のみ実行（適用はしない）
winget configure <YAMLファイル> --validate-only

# 構成の適用時に対話的な確認をスキップ
winget configure <YAMLファイル> --accept-configuration-agreements
```

## 実用的なワンライナー例

以下はコピペで使える便利なワンライナーコマンドです。

### 開発環境のセットアップ

```powershell
# 基本的な開発環境を一括インストール
winget install -e --id Microsoft.VisualStudioCode && winget install -e --id Git.Git && winget install -e --id OpenJS.NodeJS.LTS && winget install -e --id Microsoft.WindowsTerminal
```

### 一般的なアプリケーションの一括インストール

```powershell
# 一般的なアプリの一括インストール
winget install -e --id Mozilla.Firefox && winget install -e --id Google.Chrome && winget install -e --id 7zip.7zip && winget install -e --id VideoLAN.VLC && winget install -e --id Adobe.Acrobat.Reader.64-bit
```

### PowerShellの最新化

```powershell
# PowerShell最新版をインストール
winget install -e --id Microsoft.PowerShell
```

### すべてのMicrosoft製アプリを更新

```powershell
# Microsoft製アプリをすべて更新
winget upgrade --query Microsoft --include-unknown
```

### インストール済みアプリの定期メンテナンス

```powershell
# アプリの一括アップデートとPowerShell更新スクリプト
winget upgrade --all --include-unknown > update_log.txt; Get-Content update_log.txt
```

## YAML構成ファイルの例

### 基本的な開発環境セットアップ

```yaml
# dev-setup.dsc.yaml
properties:
  resources:
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: VSCode
      properties:
        id: Microsoft.VisualStudioCode
        source: winget
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Git
      properties:
        id: Git.Git
        source: winget
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Node
      properties:
        id: OpenJS.NodeJS.LTS
        source: winget
    - resource: Microsoft.WinGet.DSC/WinGetPackage
      id: Terminal
      properties:
        id: Microsoft.WindowsTerminal
        source: winget
```

## トラブルシューティング

### 一般的なエラーと解決方法

* **ソースの更新失敗**: `winget source update` を実行してソースを更新します。
* **インストール時のエラー**: `--force` オプションを試すか、管理者権限で実行します。
* **パッケージが見つからない**: 正確なIDを確認するため `winget search -e <パッケージ名>` を使用します。
* **ハングする場合**: ネットワーク接続を確認し、プロキシ設定を見直します。

### インストールの競合の解決

```powershell
# 競合するインストールを強制的に上書き
winget install -e --id <パッケージID> --force

# 既存のインストールをまず削除してから再インストール
winget uninstall -e --id <パッケージID> && winget install -e --id <パッケージID>
```

## 参考リンク

- [Microsoft公式ドキュメント - Windows Package Manager](https://learn.microsoft.com/ja-jp/windows/package-manager/)
- [GitHub - microsoft/winget-cli](https://github.com/microsoft/winget-cli)
- [winget-pkgs リポジトリ](https://github.com/microsoft/winget-pkgs)

## まとめ

wingetは、Windowsユーザーにとって強力なパッケージ管理ツールです。このチートシートを活用して、コマンドラインから効率的に環境構築や管理を行いましょう。新機能も随時追加されているので、定期的に `winget -v` で最新バージョンを確認することをお勧めします。

---

もし記事が役立ったら、ぜひ「いいね」やコメントをいただけると嬉しいです。質問や追加したいコマンドがあれば、コメント欄でお知らせください！