PowerShellからインストールされているすべてのソフトウェアのリストを取得する方法

最終更新: 16/10/2025
  • レジストリ (アンインストール キー) は、「プログラムの追加と削除」に表示される内容の最も信頼できるソースです。
  • Win32_Product は MSI では動作しますが、速度が遅く、修復が必要になる可能性があります。注意して使用してください。
  • Get-Package は、すべてのシステム ソフトウェアではなく、PackageManagement (PowerShellGet/NuGet) パッケージを一覧表示します。
  • TXT/CSV および Compare-Object を使用してエクスポートおよび比較します。Geek Uninstaller および UninstallView はレポートを効率化します。

PowerShell でインストールされたソフトウェアを一覧表示する

コンピュータにどんなプログラムがあるのか​​をすぐに知りたいと思ったことがあるなら Windowsグラフィカルインターフェースのないサーバーを管理する場合でも、システムを再インストールする場合でも、信頼できるインベントリは不可欠です。この記事では、その詳細を段階的に説明します。 インストールされているソフトウェアを一覧表示してエクスポートするすべての方法 使用して PowerShellの、WMI、レジストリ、サードパーティツール.

私たちはいくつかの実証済みの技術を統合し、その長所と短所についてコメントします。 コマンド 次のような高度なオプションに直接アクセスします Get-Package と PackageManagement、レジストリ クエリ (アンインストール)、リモート実行、さらには比較 前後のリスト間 formatearさらに、TXT/CSV/HTML エクスポート オプションも追加する予定です。また、希望者向けには、わずか 2 回のクリックでこれを実行できるサードパーティ ユーティリティも追加する予定です。

プログラムをリストアップする価値がある理由

明確なインベントリがあれば、再インストール時の見落としを防ぎ、不要になったソフトウェアを見つけるのに役立ちます。多くのコンピューターでは、テストされていないアプリケーションが忘れ去られ、スペースを占有し、さらに悪いことに、 バックグラウンドでリソースを消費し続けるものもある あなたが気づかないうちに。

リスト表示により、一目で確認できるので、「アプリと機能」インターフェースをスクロールするよりも便利です。また、サポート、監査、コンプライアンスも容易になり、複数のWindows Core PCやサーバーを管理する場合の時間も節約できます。 GUIはなく、すべてコンソールを通じて実行されます。.

これらのテクニックは、Windowsの複数のバージョンで機能します。 Windows Server 2012 R2、2016、2019、Windows 7/10/11ニュアンスの違いについては、必要に応じてコメントします。

後でわかるように、すべてのメソッドが同じものを表示するわけではありません。PowerShell、WMI、レジストリ、PackageManagementはすべて異なるソースをクエリします。 そのため、各技術が何をカバーし、その限界を把握することが重要です。 それぞれの場合に適切なものを選択します。

PowerShell でインストールされたプログラムを一覧表示する

インストールされているプログラムを表示するための簡単なPowerShellメソッド

PowerShellはリストを出力するための直接的なパスを提供しています。まずは最も基本的なものから始めましょう。 レジストリのアンインストールキーを確認するこれは、従来の「プログラムの追加と削除」ビューを実際に実行しているものです。

別名 gp (Get-ItemProperty) プロパティを素早く読み取ることができます。2つのパス(64ビットと32ビット)を組み合わせて、表示される名前を持つ要素をフィルタリングできます。

gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { -not ::IsNullOrWhiteSpace($_.DisplayName) } | Select-Object DisplayName

より構造化されたもの(名前、バージョン、発行元、日付)が好みであれば、画面上で確認できるように、アーキテクチャと形式ごとにコンパクトな表に分けます。 素早い読書に最適です:

# 64 bits
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

# 32 bits
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize

Windowsインストーラー経由でインストールされたソフトウェアを見つけるには、WMI/WMICを使用する方法もあります。一般的なコマンドは以下の2つですが、以下に注意点を示します。 動作が遅くなり、MSI修復が必要になる可能性がある.

# Win32_Product (WMI)
Get-WmiObject -Class Win32_Product | Select-Object -Property Name

# Alias rápido
gwmi Win32_Product

# WMIC clásico
wmic product get name,version

最後に、多くの人がGet-Packageを試します。注: Get-Package は、PackageManagement (NuGet/PowerShellGet など) 経由でインストールされたパッケージのみを一覧表示します。すべての従来のシステムソフトウェアに対応しているわけではありません。ただし、リポジトリからインストールされたモジュールやスクリプトには役立ちます。

# Paquetes gestionados por PackageManagement
Get-Package

# Todas las versiones de un proveedor concreto
Get-Package -ProviderName PowerShellGet -AllVersions

# Versión concreta de un paquete
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1

複数のコンピュータを管理している場合は、PowerShell Remotingを使用して管理対象パッケージをリモートでクエリできます。例えば、 Server01でGet-Packageを実行します 有効な資格情報:

Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }

リストをTXTまたはCSVにエクスポートして、前後を比較します。

画面上で確認するのは良いですが、ファイルに保存する方が実用的です。PowerShellを使用すると、出力を プログラム名でソートされたTXT 冷静に見直したり共有したりすることができます。

# 32 bits en TXT
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName |
  Out-File -FilePath "C:\Users\TuUsuario\Documents\InstalledPrograms.txt"

Excel/LibreOfficeで読み込み可能なCSV形式がお好みであれば、64ビットと32ビットの両方のブランチを共通のファイルにエクスポートできます。典型的な例では、Out-Fileコマンドで.csv拡張子で出力しますが、実際のCSV形式の場合は、 エクスポート-CSV -NoTypeInformation.

# 64 bits a CSV
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName |
  Export-Csv -NoTypeInformation -Encoding UTF8 -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"

# 32 bits al mismo CSV (añadiendo)
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
  Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
  Sort-Object DisplayName |
  Export-Csv -NoTypeInformation -Encoding UTF8 -Append -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"

何も失うことなくシステムを再インストールすることが目的の場合、便利な手法は「前」と「後」のリストを生成して比較することです。 Compare-Objectを使用すると、何が不足しているか、何が余分であるかをすぐに確認できます。; ガイドと組み合わせて使うこともできます ソフトウェアとドライバーのインストールを自動化する フォーマット後。

Compare-Object -ReferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms.txt) \
               -DifferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms2.txt)

SideIndicator列を見てください。=>記号は、要素が最初のファイルではなく2番目のファイルにあることを示し、<=はその逆を示します。=が表示されている場合は、要素は 両方のリストに違いなく表示される.

  Linux 上で GNOME 50 を設定する: 新機能と主な機能

PowerShellでプログラムリストをエクスポートする

レジストリを確認する: キー、カウント、プロパティをアンインストールする

従来のインストーラーのほとんどは、アンインストール情報をレジストリに記録します。そのため、「プログラムの追加と削除」のようなリストが必要な場合は、 最も信頼できる情報源はアンインストールキーです チームの。

メイン パスは HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall です。64 ビット システム上の 32 ビット アプリケーションの場合は次のブランチもあります。 HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall.

特定のブランチに登録されているアプリケーションの数を数えるには、 Get-ChildItem サブキーの数を取得します。

$UninstallPath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall'
(Get-ChildItem -Path $UninstallPath).Count

特定のプロパティ(例えば、表示名だけ)を抽出したい場合は、レジストリ値を取得することができます。 GetValue('表示名') 読みやすいように並べ替えます。

Get-ChildItem -Path $UninstallPath |
  ForEach-Object { $_.GetValue('DisplayName') } |
  Sort-Object

複数のプロパティを持つオブジェクトを構成するには (SCCM の Win32Reg_AddRemovePrograms で見られるものと同様)、識別子、発行元、バージョン、およびインストール日を追加する小さなパイプラインを構築できます。 これにより、より完全な在庫が得られます:

Get-ChildItem $UninstallPath |
  ForEach-Object {
    $ProdID = ($_.Name -split '\\')
    Get-ItemProperty -Path "$UninstallPath\$ProdID" -ErrorAction SilentlyContinue |
      Select-Object DisplayName, InstallDate, @{n='ProdID'; e={$ProdID}}, Publisher, DisplayVersion
  } | Select-Object -First 10

このアプローチは、Win32_Productの欠点(遅い、MSIの副作用)を回避し、クラスとしてSCCMに依存しません。 Win32Reg_AddRemovePrograms追加のインフラストラクチャなしでローカル監査に非常に役立ちます。

WMI/WMIC: いつ使用するのか、またどのようなリスクがあるのか​​?

Windowsインストーラ関連のWMIクラス(Win32_Productなど)は、他のエンジンを使用するインストーラを除き、MSIでインストールされたソフトウェアのみを返します。さらに、 Win32_Product をクエリすると、MSI 製品の修復がトリガーされる可能性があります。 時間がかかるため、本番サーバーでは理想的ではありません。

それでも、あなたが興味を持つ環境はあります あなたが「知っている」ことを正確に抽出する Windowsインストーラー。それが彼らの目的です。

Get-WmiObject -Class Win32_Product | Select-Object -Property Name

gwmi Win32_Product

wmic product get name,version

これらのコマンドを使用する場合は、十分な注意を払い、メンテナンス期間中に実行してください。一般的なインベントリについては、 レジストリ方式は通常より安全で高速ですさらに、より広範囲のアプリケーションをカバーします。

  Windows アップデートの種類とその意味

Get-Packageの詳細:実際にリストされる内容と便利なパラメータ

Get-PackageはPackageManagement(OneGet)に属し、PowerShellGet、NuGetなど、プロバイダーによってインストールされたパッケージを返します。 最も人気のあるソフトウェアパッケージインストーラー.

基本構文は、名前とバージョンによるフィルターをサポートしています。必要に応じてプロバイダーを強制的に初期化したり(ブートストラップ)、すべてのバージョンを一覧表示したり、 プロバイダーで絞り込む (PowerShellGet、NuGet) またはタイプ別(モジュール、スクリプト):

Get-Package  <String[]>]    
               >]         

知っておくべき関連パラメータ(一部は動的でプロバイダーによって異なります): 肝心のレビューはこちら:

  • -name: 1つ以上の名前(ワイルドカードがサポートされています)。特定のパッケージを見つけるのに役立ちます。
  • -プロバイダー名: ベンダー別にフィルターします。一般的な値: Bootstrap、NuGet、PowerShellGet。-AllVersions との組み合わせが最適です。
  • -すべてのバージョン: 最新のバージョンだけでなく、インストールされているすべてのバージョンを返します。
  • -必要なバージョン、-MinimumVersion、-MaximumVersion: 返される正確なバージョンまたはバージョンの範囲を制限します。
  • -範囲: パッケージがインストールされている場所に応じて、CurrentUser または AllUsers になります。
  • -force: 確認を避け、適切な場合にコマンドを強制します。
  • -フォースブートストラップ: 必要なプロバイダーが存在しない場合は自動的にインストールされます。
  • -プレリリースバージョンを許可: 結果には暫定バージョンが含まれます。
  • -インストールアップデート: Get-Package がそれをサポートするプロバイダーを使用して更新プログラムをインストールできるシナリオの場合。
  • -タイプ (PowerShellGet): モジュール、 スクリプト またはすべて。
  • -除外バージョン および -Destination (NuGet): 該当する場合、フォルダー名と抽出ディレクトリに影響します。
  • -依存関係をスキップ (NuGet): 依存関係の検索をスキップします。
  • -SkipPublisherCheck (PowerShellGet): 特定のケースでは発行者のチェックを無視します。
  • -パッケージ管理プロバイダー: パッケージ管理プロバイダーを指定します。
  • -パス更新なし: Install-Script 動的パラメーター。Get-Package には実際には適用されません。
  • 共通パラメータ: Verbose、Debug、ErrorAction、WarningAction、OutVariable など。

典型的な実例としては、PowerShellGetでインストールされたものをすべてリストし、特定のバージョンを検索し、さらに連鎖的にアンインストールすることなどが挙げられます。 アンインストールパッケージ チャネリングを通じて:

# Todo lo de PowerShellGet, con todas las versiones
Get-Package -ProviderName PowerShellGet -AllVersions

# Versión exacta de PackageManagement
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1

# Desinstalar una versión concreta de un paquete
Get-Package -Name posh-git -RequiredVersion 0.7.3 | Uninstall-Package

Get-Packageはリモート対応(Invoke-CommandまたはEnter-PSSession)であり、プロバイダーは動的パラメータを追加できることに注意してください。出力は、 Microsoft.PackageManagement.Packaging.SoftwareIdentityパッケージ メタデータ付き。

  Google リンク ファミリー エラー – 何か問題が発生しました

「手動でインストールされた」ソフトウェアはどうでしょうか? 留意すべき制限事項

フォルダをコピーして展開し、アンインストーラーを登録しないアプリケーションがあります。これらのアプリケーションは、Uninstall、Win32_Product、PackageManagementには表示されません。このような場合は、以下の手順に従って、ファイルとフォルダとして管理してください。 プログラムを手動でインストールする特定のパス、実行可能ファイル、または署名を検索するスクリプトを使用します。

同じ理由で、同じソフトウェアを搭載した 2 台のコンピューターでも、1 台が MSI でインストールされ、もう 1 台が MSI でインストールされた場合、異なる結果が表示されることがあります。 アンインストールを記録せずに別のインストーラーで理想的な在庫は、環境に応じていくつかの技術を組み合わせます。

リモート実行とWindowsバージョンの互換性

サーバーやPC群の場合は、PowerShellリモート処理が最適です。リモートセッション(Enter-PSSession)またはコマンド呼び出し(Invoke-Command)を使用すると、これまでと同じコマンドでデータを収集できます。 コンピュータから在庫を一元管理する.

有効なドメイン資格情報を使用してリモート サーバーで Get-Package をクエリする基本的な例。WinRM が既に構成されている場合に最適です。

Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }

レジストリ(アンインストール)テクニックはWindows 7/10/11およびWindows Server 2012 R2/2016/2019で動作しますが、Get-Packageでは パッケージ管理とサプライヤー 適切なものが存在するか、または自己インストール可能 (ForceBootstrap が役立ちます)。

PowerShell-3でインストールされたプログラムを一覧表示する
関連記事:
PowerShell やその他のテクニックを使用して Windows にインストールされているプログラムを一覧表示する