如何运行单个命令来显示 Windows 10 中已安装的所有应用程序?

如何运行单个命令来显示 Windows 10 中已安装的所有应用程序?

跟进并扩大这个问题,我想知道如何获取如 appwiz.cpl 中所示的应用程序列表,它始终显示所有已安装的应用程序。

从这里我们知道其他安装程序(如 InstallShield、Wise、NSIS)不会使用 WMIC 注册应用程序,因此

wmic product get name,version

向我展示了一些应用程序,包括 Visual C++、Apple Software Update 和其他应用程序,但缺少许多应用程序,例如:

  • 7-Zip
  • 谷歌浏览器
  • 火狐浏览器
  • Mozilla Thunderbird
  • 甚高频液晶

是否有 powershell 或其他方法可以显示所有已安装的应用程序?

答案1

“程序和功能”也可以通过控制面板文件 appwiz.cpl 启动,其中列出了所有以定义的方式注册的应用程序,以便出现在此列表中。这通常是用户通常可以删除或修改已安装应用程序的主要入口点。

我说的是传统意义上的,正如 Windows 现在所拥有的,在新的“设置”选项下有一个“应用和功能”页面 (%Windir%\ImmersiveControlPanel\SystemSettings.exe)。此应用程序列表还包括现在称为 Windows Modern 应用程序(又称 metro、全屏或 Windows Store 应用程序)的应用程序。由于问题专门针对程序和功能,因此本回答不会涵盖这些内容。

作为开发人员,有多种方法可以创建安装程序来打包应用程序,例如使用 Windows Installer,然后使用以下工具包创建 MSI 文件威克斯或 InstallShield。然后是开发人员创建的自定义安装程序。无论如何,为了确保您的应用程序出现在上面的列表中,你只需要定义两个值尽管通常有更多的标准值,但这些是:

  • 显示名称
  • 卸载路径

根据所安装的应用程序,“卸载程序”项可以在以下注册表位置找到:

32 位计算机:

  • HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

64 位计算机:

  • HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKCU:\SOFTWARE\Wow6432nodeMicrosoft\Windows\CurrentVersion\Uninstall
  • HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM:\SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall

在哪里:64 位应用程序上的 32 位应用程序通常位于 Wow6432node 下。HKCU 下的程序是针对用户的安装程序,而不是针对计算机的安装程序,有时是安装程序中显示的一个选项。

因此,要枚举所有已安装的应用程序(就像 Explorer.exe 一样),当您启动程序和功能时,您必须考虑上述键下的值。

还有一点需要注意,应用程序可以使用 DWORD 将自己“隐藏”在该列表中SystemComponent。该值可以是 1 或 0,其中 1 表示应用程序从列表中隐藏。我猜想这样做的目的是为了让用户通常无法管理的系统组件(例如 .NET)保持隐藏状态。然而,供应商通常会使用这种方法,他们会为套件安装多个组件,然后创建统一的卸载程序,以便更轻松地删除整个应用程序并按正确的顺序删除每个组件。

因此,以下 PowerShell 命令将枚举上述每个 Uninstall 键,并且当 SystemComponent 不为 1 且存在 DisplayName 值时,将打印 DisplayName:

foreach ($UKey in 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*','HKLM:\SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall\*','HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*','HKCU:\SOFTWARE\Wow6432node\Microsoft\Windows\CurrentVersion\Uninstall\*'){foreach ($Product in (Get-ItemProperty $UKey -ErrorAction SilentlyContinue)){if($Product.DisplayName -and $Product.SystemComponent -ne 1){$Product.DisplayName}}}

当然,现在还有其他应用程序您可能归类为已安装,但如果它们没有在上述位置之一注册,它们将不会出现并且超出了问题的范围。

还有其他方法可以获取此列表中的项目,但由于仅返回基于 MSI 的应用程序,因此可能仅返回子集。

答案2

问题:是否有 powershell 或其他方法可以显示所有已安装的应用程序?

參閱如何在 Windows 上创建已安装程序的列表


$outputFile = "$env:APPDATA\Installed_Applications.txt"
$OS_Architecture = $env:PROCESSOR_ARCHITECTURE
if($OS_Architecture -eq 'x86') 
{
    #write-host '32-bit'
    $key = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
}
else
{
    #write-host '64-bit'
    $key = "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
}

Get-ItemProperty $Key |
        Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
            Format-Table –AutoSize |
                Out-File $outputFile -Encoding UTF8 -Force
                    Start-Process $outputFile

这是一个自我提升脚本,用于获取具有管理员权限的所有内容:

cls
# Self-elevate the script if required
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
  if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
      #$CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
      $CommandLine = $MyInvocation.InvocationName
      Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
      Exit
     }
    }

$outputFile = "$env:APPDATA\Installed_Applications.txt"
$OS_Architecture = $env:PROCESSOR_ARCHITECTURE
if($OS_Architecture -eq 'x86') 
{
    #write-host '32-bit'
    $key = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
}
else
{
    #write-host '64-bit'
    $key = "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
}

Get-ItemProperty $Key |
        Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
            Format-Table –AutoSize | Out-String -Width 300 |
                Out-File $outputFile -Encoding UTF8 -Force 
                    Get-AppxPackage -AllUsers |
                        Out-File -Append $outputFile -Encoding UTF8 -Force 
                            Start $outputFile

答案3

之后输入打开 Powershell运行它作为管理员

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

PowerShell 将为您提供所有程序的列表,其中包括版本、开发人员名称,甚至安装日期。

powershell 中已安装软件的列表

不过,您可能希望将其导出到文件中,这也很容易。您只需使用 > 符号发送输出,并添加要创建的新文本文件的路径即可。例如:

Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize > C:\Users\Lori\Documents\InstalledPrograms-PS.txt

已安装程序列表导出到文本文件

这是来源。

相关内容