wingetでアプリを管理する
概要
Windowsでアプリをインストールする方法は、ソフトウェアの配布サイト(アプリの公式や窓の杜などのサイト)からインストーラーをダウンロードしてGUIでインストールするのが一般的である。(ほかには、Microsoftストアからインストールする方法もあるにはあるが……)
たくさんのアプリをインストールする場合は、その都度インストール作業をポチポチ行う必要があり、これは非常に面倒。
一方、LinuxではコマンドラインからCUIでインストール(yum, dfn, apt など)が一般的。
これだと、スクリプトを書いておくとコマンド一発で所望のアプリを一括インストール、というようなことが簡単に実現できる。
実は、Windowsでも コマンドラインからCUIでインストールすることができる。
この用には、以前よりChocolaty(chocoコマンド)が存在していたが、有志のプロジェクトということもあり、個人所有ならともかく、企業で業務利用するPCで積極的に使うのはちょっと躊躇いがあった。
最近では、Microsoft自身がCUIによるアプリ管理方法を整備しており、Windows10 Windows11では、マイクロソフト謹製の winget というコマンドが使えるようになっている。
Microsoftが公式に提供している機能ということもあって、業務利用でも安心して(?)使用することができる。
そんな、winget コマンドでアプリを管理する方法について、よく使うところだけ、簡単に記す。
Wingetを導入する
インストールされているアプリを一覧表示する
winget list
アプリを探す
インストールしたいアプリの正確な名前(ID、モニカー)を確認する。
winget search <キーワード>
アプリをインストールする
winget install <appname>
アップグレードできるアプリを表示
winget upgrade
アプリをアップグレードする
winget upgrade <appname>
アプリを削除する
winget uninstall notepad++
インストール先のこと
Wingetに限ったことではないが、インストーラーを使ったWindowsアプリのインストール先には、基本的に次のパターンがある。
システムインストール ※管理者権限が要る
すべてのユーザー(ALL USERS) C:\Program Files\
, C:\Program Files (x86)\
など
ユーザーインストール
現在のユーザー(CURRENT USER) C:\Users\<USERNAME>\AppData\Local\Programs\
など
個人所有など、自分専用として専有できるパソコンならば、別にどちらを選ぼうが構わない。
会社や家族共用しているなど、複数ユーザーが共有するパソコンでは、ALL USERSでインストールしたいケースが多いに違いない。
ありがちな失敗例(自分の経験)
管理者権限のあるadminユーザーでアプリをインストールしたが、本来そのアプリを使いたい一般ユーザーでサインインすると、アプリは使えない状態のままだった。
インストーラーのデフォルトがユーザーインストールだったため、adminだけが使える状態でインストールされたことが原因。
winget installに –scopeオプションを付けると、インストール範囲をuserまたはmachineに設定できる。userで基本ユーザーインストール、machineで基本システムインストールになるようだ。(デフォルトはuser)
いちいち –scope machine を付けるのが面倒なら winget settings で次のようにしておくと毎度オプション指定する手間が省ける。
settings.jsonに追記
"installBehavior": {
"preferences": {
"scope": "machine"
}
},
Help
winget help
PS C:\Users\hmv13> winget --help
v1.4.10173 の Windows パッケージ マネージャー
Copyright (c) Microsoft Corporation. All rights reserved.
WinGet コマンド ライン ユーティリティを使用すると、コマンド ラインからアプリケーションやその他のパッケージをインストールできま す。
使用法: winget [<コマンド>] [<オプション>]
使用できるコマンドは次のとおりです:
install 指定されたパッケージをインストール
show パッケージに関する情報を表示します
source パッケージのソースの管理
search アプリの基本情報を見つけて表示
list インストール済みパッケージを表示する
upgrade 利用可能なアップグレードの表示と実行
uninstall 指定されたパッケージをアンインストール
hash インストーラー ファイルをハッシュするヘルパー
validate マニフェスト ファイルを検証
settings 設定を開くか、管理者設定を設定する
features 試験的な機能の状態を表示
export インストールされているパッケージのリストをエクスポート
import ファイル中のすべてのパッケージをインストール
特定のコマンドの詳細については、そのコマンドにヘルプ引数を渡します。 [-?]
次のオプションを使用できます。
-v,--version ツールのバージョンを表示
--info ツールの一般情報を表示
-?,--help 選択したコマンドに関するヘルプを表示
--wait 終了する前に任意のキーを押すプロンプトをユーザーに表示します
--verbose,--verbose-logs WinGet の詳細ログを有効にする
--disable-interactivity 対話型プロンプトを無効にします
その他のヘルプについては、次を参照してください: https://aka.ms/winget-command-help
PS C:\Users\hmv13>
winget install help
PS C:\Users\hmv13> winget install --help
v1.4.10173 の Windows パッケージ マネージャー
Copyright (c) Microsoft Corporation. All rights reserved.
Installs the selected package, either found by searching a configured source or directly from a manifest. By default, the query must case-insensitively match the id, name, or moniker of the package. Other fields can be used by passing their appropriate option. By default, install command will check package installed status and try to perform an upgrade if applicable. Override with --force to perform a direct install.
使用法: winget install [[-q] <query>] [<オプション>]
次のコマンド エイリアスを使用できます:
add
次の引数を使用できます。
-q,--query パッケージの検索に使用されるクエリ
次のオプションを使用できます。
-m,--manifest パッケージのマニフェストのパス
--id ID で結果をフィルター処理
--name 名前で結果をフィルター処理
--moniker モニカーで結果をフィルター処理
-v,--version 指定されたバージョンを使用します。既定値は最新バージョンです
-s,--source 指定されたリソースを使用してパッケージを検索
--scope インストールの範囲 (ユーザーまたはコンピューター) の選択
-a,--architecture アーキテクチャを選択してインストール
-e,--exact 完全一致を使用してパッケージを検索
-i,--interactive 対話式のインストールが要求されます。ユーザーの入力が必要になる場合があります
-h,--silent サイレント インストールを要求
--locale 使用するロケール (BCP47 形式)
-o,--log ログの場所 (サポートされている場合)
--override インストーラーに渡される引数を上書き
-l,--location インストール先 (サポートされている場合)
--ignore-security-hash インストーラーのハッシュのチェックが失敗しても無視します
--ignore-local-archive-malware-scan ローカル マニフェストからのアーカイブの種類のパッケージのインストールの一環として実行さ れたマルウェア スキャンを無視します
--dependency-source 指定されたリソースを使用してパッケージの依存関係を検索
--accept-package-agreements パッケージのすべての使用許諾契約に同意する
--no-upgrade インストール済みバージョンが既に存在する場合はアップグレードをスキップします
--header オプションの Windows-Package-Manager REST ソース HTTP ヘッダー
--accept-source-agreements ソース操作中にすべてのソース契約に同意する
-r,--rename 実行可能ファイルの名前を変更する値 (ポータブル)
--force コマンドを直接実行し、セキュリティ関連でない問題の場合に続行します
-?,--help 選択したコマンドに関するヘルプを表示
--wait 終了する前に任意のキーを押すプロンプトをユーザーに表示します
--verbose,--verbose-logs WinGet の詳細ログを有効にする
--disable-interactivity 対話型プロンプトを無効にします
その他のヘルプについては、次を参照してください: https://aka.ms/winget-command-install
PS C:\Users\hmv13>
System権限か、User権限か
アプリのインストールのされ方として、System権限:すべてのユーザー(管理者権限必要)と User権限:現在のユーザー がある。
System権限: C:\Program Files\<appName> や C:\Program Files(x86)\<appName>
User権限: C:\Users\<USERNAME>\AppData\Local\Programs\<appName>
特にsettingを変更せずに、winget install でインストールすると、どちらになるかは、アプリによってまちまちのようだ。
こうしておくと、System権限でインストールされるみたい。
winget install winmerge --scope machine
上手くない方法
アプリのインストーラにオプションを渡して、System権限(/ALLUSERS etc)、User権限(/CURRENTUSER etc)を指定して、インストール先を制御することもできるが、アプリによっては反映されないことあった。
winget install winscp --silent --override "/SILENT /ALLUSERS"
Notepad++
System
/S
WinMerge
User
/SILENT /ALLUSERS
v2.16.28 wingetでオプション指定してもUser権限になる(単体インストーラーだとSystem権限)
WinSCP
User
/VERYSILENT /NORESTART /ALLUSERS
スクリプト
- installApps.cmd
powershell -ExecutionPolicy RemoteSigned -File .\installApps.ps1
- installApps.ps1
$list = "7zip.7zip", `
"winscp", `
"Notepad++.Notepad++", `
"Microsoft.WindowsTerminal", `
"VideoLAN.VLC"
foreach ($item in $list) {
echo "[$item]"
winget install $item --silent --scope machine
if ($?) { echo "=>成功" } else { echo "=>失敗" }
}
文字化けを避けるには、エンコードを「UTF-8-BOM」にする。