wingetを使おう 中編:wingetでソフトを管理する

2021年8月10日WindowsWindows

Microsoftのパッケージ管理ソフト「winget」の使い方を紹介します。wingetは、Linuxでいうaptやyum、dnfなどに相当するツールで、wingetコマンドを通して、wingetリポジトリ(や、将来的にはMicrosoftストア)で配布されているソフトを導入することができます。

中編のこの記事では、wingetを用いたアプリのアンインストールやバージョンアップ、インストール済みソフト一覧の取得やソフトの一括インストール方法を紹介します。

ご案内

本記事は、「wingetを使おう」前編・中編・後編のうち中編です。

前編では、wingetそのもののインストール方法と、wingetを用いたアプリのインストール方法を紹介します。

中編(本記事)では、wingetを用いたアプリのアンインストール、アップグレードや、インストール済みアプリ一覧の取得方法を紹介します。

後編では、wingetそのものの設定方法やその他情報(PowerShellのTabキー補完)を紹介します。

wingetでインストール済みソフトを管理する

wingetでインストールしたアプリは、wingetコマンドで管理することができます。ここでは、wingetを用いてアプリをアンインストールする方法と、アップデートする方法を紹介します。

winget uninstall:パッケージをアンインストールする

wingetでインストールしたソフトは、winget uninstall パッケージ名でアンインストールできます。

PS C:\> winget uninstall CrystalDiskMark

Windows Terminalを一般権限で開いている場合、アンインストールの際も、UACの昇格確認がある場合があります。問題なければ「はい」を押しましょう。

アンインストールの際も、アプリによってはUAC昇格が必要です

今回例に挙げたCrystalDiskMarkの場合は、アンインストールは途中で「設定やログを削除して良いか」と聞かれます。このあたりの扱われ方は、ソフトによると思います。他のソフトでは、何も聞かれずにアンインストールが進みます。

アプリによっては、アンインストール中にダイアログが表示されます

下記のように、正常終了と表示されたら、アンインストール完了です。

PS C:\> winget uninstall CrystalDiskMark
見つかりました CrystalDiskMark [CrystalDewWorld.CrystalDiskMark]
パッケージのアンインストールを開始しています...
正常にアンインストールされました
アンインストールが完了しました

winget upgrade:パッケージをアップデートする

パッケージを最新版にアップデートする

wingetでインストールしたパッケージは、winget upgrade パッケージ名で最新バージョンに更新できます。このときも、パッケージ名には正式名かIDかmonikerに完全一致するよう指定します。

PS C:\> winget upgrade CrystalDiskMark
見つかりました CrystalDiskMark [CrystalDewWorld.CrystalDiskMark]
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
Downloading https://osdn.net/frs/redir.php?m=auto&f=crystaldiskmark%2F75540%2FCrystalDiskMark8_0_4.exe
  ██████████████████████████████  3.87 MB / 3.87 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
「winget upgrade パッケージ名」でアップデートできます

パッケージを指定したバージョンにアップデートする

また、winget upgradeでも-vオプション(–versionオプション)が利用できます。これで、指定のバージョンへ更新できます。

PS C:\> winget upgrade CrystalDiskMark -v 8.0.3
見つかりました CrystalDiskMark [CrystalDewWorld.CrystalDiskMark]
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
Downloading https://osdn.net/frs/redir.php?m=auto&f=crystaldiskmark%2F75466%2FCrystalDiskMark8_0_3.exe
  ██████████████████████████████  3.86 MB / 3.86 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
アップデート時も「-v」オプションでバージョンを指定できます

ちなみに、今より古いバージョンを指定しても、ダウングレードはできないようです。

PS C:\> winget upgrade CrystalDiskMark -v 8.0.2
適用可能な更新は見つかりませんでした。
古いバージョンを指定しても、ダウングレードはできません

すべてのパッケージを最新版にアップデートする

パッケージ名なしで実行すると、アップデートがあるパッケージを出力してくれます。

PS C:\> winget upgrade
名前            ID                              バージョン 利用可能 ソース
--------------------------------------------------------------------------
CrystalDiskInfo CrystalDewWorld.CrystalDiskInfo 8.6.1      8.12.4   winget
CrystalDiskMark CrystalDewWorld.CrystalDiskMark 8.0.2      8.0.4    winget
単に「winget upgrade」を実行すると、アップデート可能なアプリをリストアップしてくれます

すべてのパッケージをアップデートするには、winget upgrade --allを実行します。アップデートするアプリが多い場合は、何度もUAC昇格が必要になると思いますので、管理者権限でWindows Terminalを起動しておくと便利です。

PS C:\> winget upgrade --all
見つかりました CrystalDiskInfo [CrystalDewWorld.CrystalDiskInfo]
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
Downloading https://osdn.net/frs/redir.php?m=auto&f=crystaldiskinfo%2F75685%2FCrystalDiskInfo8_12_5.exe
  ██████████████████████████████  4.50 MB / 4.50 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました

見つかりました CrystalDiskMark [CrystalDewWorld.CrystalDiskMark]
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
Downloading https://osdn.net/frs/redir.php?m=auto&f=crystaldiskmark%2F75540%2FCrystalDiskMark8_0_4.exe
  ██████████████████████████████  3.87 MB / 3.87 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
「winget upgrade --all」で、全アプリのアップデートが可能です

インストール済みソフトの一覧を取得する

パソコンにインストールしているソフトの一覧を取得する方法を紹介します。winget listを使用して画面上にリストアップする方法と、winget exportを使用してJSON形式で出力する方法があります。

winget list:インストール済みソフトをリストアップする

winget listを実行すると、パソコンにインストール済みのソフトをリストアップしてくれます。winget以外でインストールしたソフトもリストアップされるようです。今後のバージョンアップでMicrosoftストアなどのリポジトリも扱えるようになるらしいので、それを想定した動作なのでしょう。

PS C:\> winget list
名前                                  ID                                    バージョン
---------------------------------------------------------------------------------------------
インテル® グラフィックス・コマンド・… AppUp.IntelGraphicsExperience_8j3eq9… 1.100.3370.0
Ubuntu                                CanonicalGroupLimited.UbuntuonWindow… 2004.2021.222.0
CrystalDiskMark                       CrystalDewWorld.CrystalDiskMark       8.0.4
Docker Desktop                        Docker.DockerDesktop                  3.5.2
ELAN Touchpad 12.11.3.2_X64_Beta      Elantech                              12.11.3.2
Microsoft Edge                        Microsoft.Edge                        92.0.902.55
Microsoft Edge Update                 Microsoft Edge Update                 1.3.145.49
(以下省略)
「winget list」で、インストール済みのソフトをリストアップしてくれます

また、このコマンドもパッケージ名を指定することができます。ここは完全一致ではなく、名前、ID、monikerのいずれかに含まれる場合にリストアップしてくれるようです。

PS C:\> winget list crystal
名前            ID                              バージョン
----------------------------------------------------------
CrystalDiskInfo CrystalDewWorld.CrystalDiskInfo 8.12.4
CrystalDiskMark CrystalDewWorld.CrystalDiskMark 8.0.4
パッケージ名などで抽出することもできます

winget export:インストール済みソフト一覧をJSON形式で出力

winget exportコマンドで、インストール済みのソフトの情報をJSON形式で出力することができます。このコマンドは、winget export 出力ファイル名の形で実行します。

「どのソースからも利用できません」という警告がたくさん出てきてしまいます。いずれもwingetのリポジトリにないソフトです。恐らく、将来的にMicrosoftストアのアプリが扱えるようになったら改善されるものと思います。

PS C:\> winget export C:\Users\username\Desktop\winget-export.json
インストールされているパッケージのバージョンは、どのソースからも利用できません: インテル® グラフィックス・コマンド・センター
インストールされているパッケージのバージョンは、どのソースからも利用できません: Ubuntu
インストールされているパッケージのバージョンは、どのソースからも利用できません: ELAN Touchpad 12.11.3.2_X64_Beta
インストールされているパッケージのバージョンは、どのソースからも利用できません: Microsoft Edge Update
「winget export」で、インストール済みソフトの一覧をJSON形式で出力できます

CrystalDiskInfo、CrystalDiskMark、Docker Desktop、VLCプレイヤー、Mery(テキストエディタ)をインストールした状態でwinget exportしたら、次のようなJSONファイルが出力されました。

Edge、Windows Terminal、OneDriveは明示的にはインストールしておらず、最初から入っていたものです。恐らくwinget listでリストアップされたもののうち、wingetリポジトリからインストール可能なものがリストアップされていると思われます。

{
	"$schema" : "https://aka.ms/winget-packages.schema.2.0.json",
	"CreationDate" : "2021-07-26T01:57:31.520-00:00",
	"Sources" : 
	[
		{
			"Packages" : 
			[
				{
					"PackageIdentifier" : "CrystalDewWorld.CrystalDiskInfo"
				},
				{
					"PackageIdentifier" : "CrystalDewWorld.CrystalDiskMark"
				},
				{
					"PackageIdentifier" : "Docker.DockerDesktop"
				},
				{
					"PackageIdentifier" : "Microsoft.Edge"
				},
				{
					"PackageIdentifier" : "Microsoft.WindowsTerminal"
				},
				{
					"PackageIdentifier" : "Microsoft.OneDrive"
				},
				{
					"PackageIdentifier" : "VideoLAN.VLC"
				},
				{
					"PackageIdentifier" : "Kuro.Mery"
				}
			],
			"SourceDetails" : 
			{
				"Argument" : "https://winget.azureedge.net/cache",
				"Identifier" : "Microsoft.Winget.Source_8wekyb3d8bbwe",
				"Name" : "winget",
				"Type" : "Microsoft.PreIndexed.Package"
			}
		}
	],
	"WinGetVersion" : "1.0.11591"
}

wingetでソフトを一括インストールする

パソコンを何台も初期設定する場合など、まっさらなパソコンに対して一括でソフトをインストールしたいことがあるかもしれません。そのような状況を想定して、wingetでソフトを一括インストールする方法を紹介します。

インストールするソフトによっては、インストール時にUAC昇格が必要です。一般権限で一括インストールを行うと、インストールするソフトの分、UACメッセージが出てきてしまいますので、管理者権限でWindows Terminalなどを起動することをおすすめします。

ちなみに、Linuxのapt installdnf installでは、インストールしたいパッケージ名を列記すれば、1コマンドで複数のアプリをインストールできますが、winget installコマンドは1回あたり一つずつしかインストールできません。

winget import:JSONファイルでインストール

winget importを使用すると、winget exportで出力したJSONファイルを元に、各アプリをインストールできます。こちらは、winget import ファイル名のようにJSONファイルを指定して実行します。試しに、前項の状態からCrystalDiskInfoとMeryをアンインストールし、CrystalDiskInfoの旧バージョンを入れた状態で、前項のJSONファイルをインポートしてみました。

すると下記のように、JSONファイルにあるものを順番に探して、パソコンになければ新規インストール、パソコンに旧バージョンがあるならバージョンアップ(upgrade)を行ってくれます。

PS C:\> winget import C:\Users\username\Desktop\winget-export.json
(中略)
適用可能な更新は見つかりませんでした。
パッケージは既にインストールされています: VideoLAN.VLC
見つかりました  [CrystalDewWorld.CrystalDiskInfo]
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
Downloading https://osdn.net/frs/redir.php?m=auto&f=crystaldiskinfo%2F75539%2FCrystalDiskInfo8_12_4.exe
  ██████████████████████████████  4.50 MB / 4.50 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
見つかりました  [CrystalDewWorld.CrystalDiskMark]
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
Downloading https://osdn.net/frs/redir.php?m=auto&f=crystaldiskmark%2F75540%2FCrystalDiskMark8_0_4.exe
  ██████████████████████████████  3.87 MB / 3.87 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
見つかりました  [Kuro.Mery]
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
Downloading https://dforest.watch.impress.co.jp/library/m/mery/11901/MerySetup-x64-2.6.7.exe
  ██████████████████████████████  2.68 MB / 2.68 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
先ほどのJSONファイルを「winget import」すれば、一括でインストール・アップデートできます

スクリプト等でソフトを一括インストール

wingetはコマンドラインで動くアプリですので、スクリプト等からの実行も行いやすいです。例えば、次のようなPowerShellスクリプトを作成して実行すれば、一括でソフトをインストールすることができます。

こちらの13行目~16行目を、インストールしたいアプリ名に変更すれば、そのまま使えると思います。

<#
wingetでソフトを一括インストールするPowerShellスクリプト例 winget-install.ps1
wingetを使おう (中編:wingetでソフトを管理する)
$appListに挙げられているソフトを順にインストールしていきます。 Copyright (c) 2021 astherier This software is released under the MIT License. http://opensource.org/licenses/mit-license.php #> $appList=@( "CrystalDiskInfo", "CrystalDiskMark", "VLC", "Kuro.Mery" ) function exec_winget($app){ echo "インストール開始:$app" & winget install $app if($LastExitCode -eq 0){ $result="インストール成功:$app" }else{ $result="インストール失敗:$app" } echo $result $script:exec_result+=$result } $exec_result=@() foreach($app in $appList){ exec_winget $app } echo "インストールがすべて終了しました。" echo $exec_result
ご案内

中編はここまでです。

後編では、wingetそのものの設定方法やその他情報(PowerShellのTabキー補完)を紹介します。

ちなみに、前編では、wingetそのもののインストール方法と、wingetを用いたアプリのインストール方法を紹介しています。まだご覧になっていない方は、こちらもどうぞ。