如何從 PowerShell 取得所有已安裝軟體的列表

最後更新: 16/10/2025
作者: 艾薩克
  • 註冊表(卸載項目)是「新增或刪除程式」顯示內容的最可靠來源。
  • Win32_Product 適用於 MSI,但速度較慢且可能導致修復;請謹慎使用。
  • Get-Package 列出了 PackageManagement(PowerShellGet/NuGet)包,而不是所有系統軟體。
  • 匯出並與 TXT/CSV 和 Compare-Object 進行比較;Geek Uninstaller 和 UninstallView 簡化報告。

使用 PowerShell 列出已安裝的軟體

如果你需要快速找出計算機上有哪些程序 Windows無論您是管理沒有圖形介面的伺服器,還是重新安裝系統,您都需要擁有一份可靠的清單。在本文中,我將逐步詳細解釋。 列出和匯出已安裝軟體的所有方法 運用 PowerShell的、WMI、註冊表和第三方工具.

我們將整合幾種經過驗證的技術,評論它們的優缺點,你將從中看到 命令 直接進入進階選項,例如 使用 PackageManagement、註冊表查詢(卸載)、遠端執行甚至比較來獲取包 前後列表之間 格式此外,我們還將添加 TXT/CSV/HTML 匯出選項,並且對於喜歡的用戶,只需單擊兩次即可使用第三方實用程式完成此操作。

為什麼值得列出你的項目

擁有清晰的清單可以避免重新安裝時出現疏忽,並有助於檢測不再使用的軟體。許多電腦上堆積著未經測試的應用程序,這些應用程式被遺忘,佔用了空間,更糟的是, 有些仍在後台消耗資源 而你卻沒有意識到。

清單讓您可以一目了然地查看,而無需在「應用程式和功能」介面中捲動查看。它還可以簡化支援、審核和合規性,如果您管理多台 Windows Core PC 或伺服器,還可以節省您的時間。 沒有 GUI,一切都透過控制台完成。.

這些技術適用於多個版本的 Windows,包括 Windows Server 2012 R2、2016、2019 與 Windows 7/10/11,必要時我們會對其中的細微差別進行評論。

您稍後會看到,並非所有方法都顯示相同的內容:PowerShell、WMI、登錄和 PackageManagement 都查詢不同的來源, 這就是為什麼了解每種技術涵蓋的內容及其限制很重要。 在每種情況下選擇正確的一個。

PowerShell 列出已安裝的程式

快速 PowerShell 方法檢視已安裝程式

PowerShell 提供了輸出清單的直接路徑。讓我們從最基本的開始: 檢查註冊表中的卸載鍵,這實際上是經典的“添加/刪除程式”視圖的驅動力。

別名 gp(取得項目屬性) 允許您快速讀取屬性。您可以組合兩個路徑(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

您也可以使用 WMI/WMIC 路徑來定位透過 Windows Installer 安裝的軟體。常用的指令是這兩個,不過它們的注意事項如下: 它們可能會很慢並導致 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 -ReferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms.txt) \
               -DifferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms2.txt)

檢視 SideIndicator 列:=> 符號表示它位於第二個檔案中,而不是第一個檔案中,而 <= 表示相反。如果出現 =,則元素 出現在兩個清單中且無差異.

  偵測 iPhone 是否解鎖或鎖定的簡單方法

使用 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

如果您希望提取特定屬性(例如,僅顯示名稱),則可以使用以下命令提取註冊表值 取得值('顯示名稱') 並對其進行排序以便更舒適地閱讀:

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_新增刪除程序這使得它對於無需額外基礎設施的本地審計非常有用。

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 11 中建立智慧型資料夾以按專案或用戶端排序

深入了解 Get-Package:它實際列出的內容和有用的參數

Get-Package 屬於 PackageManagement (OneGet),並傳回由其提供者(PowerShellGet、NuGet 等)安裝的套件,與 最受歡迎的軟體包安裝程序.

基本語法支援按名稱和版本過濾。您可以強制提供者在必要時進行初始化(引導程式),列出所有版本,以及 按提供者縮小範圍(PowerShellGet、NuGet) 或按類型(模組、腳本):

Get-Package  <String[]>]    
               >]         

需要了解的相關參數(有些是動態的,取決於提供者): 以下是重要評論:

  • -薯:一個或多個名稱(支援通配符)。用於尋找特定的軟體包。
  • -提供者名稱:按供應商過濾;典型值:Bootstrap、NuGet、PowerShellGet。最好與 -AllVersions 結合使用。
  • -所有版本:傳回所有已安裝的版本,而不僅僅是最新版本。
  • -RequiredVersion, -MinimumVersion, -MaximumVersion:限制要傳回的確切版本或版本範圍。
  • -範圍:CurrentUser 或 AllUsers,取決於套件的安裝位置。
  • -力:避免確認並在適當的時候強制執行命令。
  • -ForceBootstrap:如果不存在則自動安裝所需的提供者。
  • -AllowPrereleaseVersions:結果包含初步版本。
  • -安裝更新:適用於 Get-Package 可以使用支援它的提供者安裝更新的情況。
  • -類型 (PowerShellGet):模組, 腳本 或全部。
  • -ExcludeVersion 和 -Destination(NuGet):在適用時影響資料夾名稱和提取目錄。
  • -SkipDependencies (NuGet):跳過依賴項查找。
  • -SkipPublisherCheck (PowerShellGet):在某些情況下忽略發布者檢查。
  • -PackageManagementProvider:指定套件管理提供者。
  • -無路徑更新:Install-Script 動態參數;其實並不適用於 Get-Package。
  • 通用參數:詳細、調試、錯誤操作、警告操作、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,帶有包元資料。

  如何在 Windows 11 上將 Chrome 更新至最新版本

那麼「手動安裝」的軟體呢?需要注意的限制

有些應用程式透過複製資料夾進行部署,並且未註冊卸載程式。這些應用程式不會出現在 Uninstall 或 Win32_Product 中,也不會出現在 PackageManagement 中。在這種情況下,請將它們作為文件和資料夾進行管理,並遵循以下技巧 手動安裝程式,使用搜尋特定路徑、可執行檔或簽署的腳本。

基於同樣的原因,如果兩台電腦安裝了相同的軟體,其中一台安裝了 MSI,而另一台沒有安裝 MSI,則可能會顯示不同的結果。 使用不同的安裝程式而不記錄卸載理想的庫存根據環境結合了多種技術。

遠端執行和 Windows 版本相容性

對於伺服器和 PC 叢集來說,PowerShell Remoting 是最佳選擇。透過遠端會話 (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 中已安裝的程序