当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 检查软件是否已安装 [2 种方法]

作者:精品下载站 日期:2024-12-14 05:29:14 浏览:16 分类:玩电脑

PowerShell 检查软件是否已安装 [2 种方法]


[玩转系统] PowerShell 检查软件是否已安装 [2 种方法]

Get-PackageSelect-Object Cmdlet 结合使用

Get-PackageSelect-Object cmdlet 结合使用来检查是否安装了指定的软件。

将 Get-Package 与 Select-Object Cmdlet 结合使用:

$software = "Java(TM) SE Development Kit 18.0.2.1 (64-bit)"
Get-Package | Where-Object { $_.Name -eq $software } | Select-Object Name, Version

输出 :

Java(TM) SE Development Kit 18.0.2.1 (64-bit)

首先,我们声明并初始化了一个名为 $software 的变量,其中包含我们想要检查的软件的完整名称。

接下来,我们使用 Get-Package cmdlet 检索本地计算机上安装的所有软件包的列表;所有这些包都通过管道传输到Where-Object cmdlet,该cmdlet检查Name属性是否等于$software变量的值;如果是,则将结果通过管道传输到 Select-Object cmdlet,该 cmdlet 从中选择指定的 $software 并返回它们;否则,不显示任何内容。

我们还可以在远程计算机上运行 Get-Package cmdlet,方法是将其作为 Invoke-Command cmdlet 或 Enter-PSSession cmdlet 的一部分执行或脚本。

我们还可以检查提供商提供的特定软件的所有版本。我们使用带有 -ProviderName-AllVersions 参数的 Get-Package cmdlet。

将 Get-Package 与 -ProviderName 和 -AllVersions 结合使用:

Get-Package -Name "Python*"-ProviderName msi -AllVersions

输出 :

Name                           Version          Source                           ProviderName
----                           -------          ------                           ------------
Python Launcher                3.11.7966.0                                       msi
Python 3.11.0 Standard Libr... 3.11.150.0                                        msi
Python 3.11.0 Core Interpre... 3.11.150.0                                        msi
Python 3.10.6 Add to Path (... 3.10.6150.0                                       msi
Python 3.11.0 Utility Scrip... 3.11.150.0                                        msi
Python 3.10.6 Standard Libr... 3.10.6150.0                                       msi
Python 3.10.6 Test Suite (6... 3.10.6150.0                                       msi
Python 3.11.0 Tcl/Tk Suppor... 3.11.150.0                                        msi
Python 3.10.6 Executables (... 3.10.6150.0                                       msi
Python 3.10.6 Utility Scrip... 3.10.6150.0                                       msi
Python 3.11.0 Documentation... 3.11.150.0                                        msi
Python 3.10.6 Documentation... 3.10.6150.0                                       msi
Python 3.11.0 Test Suite (6... 3.11.150.0                                        msi
Python 3.10.6 Tcl/Tk Suppor... 3.10.6150.0                                       msi
Python 3.10.6 Core Interpre... 3.10.6150.0                                       msi
Python 3.11.0 pip Bootstrap... 3.11.150.0                                        msi
Python 3.10.6 Development L... 3.10.6150.0                                       msi
Python 3.11.0 Add to Path (... 3.11.150.0                                        msi
Python 3.11.0 Executables (... 3.11.150.0                                        msi
Python 3.10.6 pip Bootstrap... 3.10.6150.0                                       msi
Python 3.11.0 Development L... 3.11.150.0                                        msi

我们已经了解了Get-Package;在这里,我们使用此 cmdlet 和 -ProviderName 参数来提及提供程序的名称,在上面的示例中为 msi。接下来,我们使用 -Name 参数来提及软件的名称;然而,以 * 表示的通配符运算符用于获取以 Python 一词开头的所有软件。

接下来,我们使用 -AllVersions 参数来检索本地计算机上安装的所有软件版本。默认情况下,Get-Package cmdlet 返回最新的可用版本。要列出特定的软件版本,我们使用 -RequiredVersion 后跟版本号。请参阅以下示例以获得清晰的理解。

将 Get-Package 与 -ProviderName 和 -RequiredVersion 结合使用:

Get-Package -Name "Python*"-ProviderName msi -RequiredVersion 3.11.150.0

输出 :

Name                           Version          Source                           ProviderName
----                           -------          ------                           ------------
Python 3.11.0 Standard Libr... 3.11.150.0                                        msi
Python 3.11.0 Core Interpre... 3.11.150.0                                        msi
Python 3.11.0 Utility Scrip... 3.11.150.0                                        msi
Python 3.11.0 Tcl/Tk Suppor... 3.11.150.0                                        msi
Python 3.11.0 Documentation... 3.11.150.0                                        msi
Python 3.11.0 Test Suite (6... 3.11.150.0                                        msi
Python 3.11.0 pip Bootstrap... 3.11.150.0                                        msi
Python 3.11.0 Add to Path (... 3.11.150.0                                        msi
Python 3.11.0 Executables (... 3.11.150.0                                        msi
Python 3.11.0 Development L... 3.11.150.0                                        msi

如果您想知道本地计算机上安装了哪些软件包(软件),我们只需运行 Get-Package cmdlet,如下所示。它将显示软件的名称版本ProviderName;请参阅以下输出。

使用获取包 Cmdlet:

Get-Package

输出 :

Name                           Version          Source                           ProviderName
----                           -------          ------                           ------------
Greenshot 1.2.10.6             1.2.10.6                                          Programs
Office 16 Click-to-Run Exte... 16.0.16130.20218                                  msi
Office 16 Click-to-Run Lice... 16.0.16130.20218                                  msi
Microsoft Update Health Tools  3.70.0.0                                          msi
Apache NetBeans IDE 15         15                                                Programs
Node.js                        18.12.1                                           msi
Microsoft Visual C++ 2019 X... 14.28.29325                                       msi
Microsoft Visual C++ 2019 X... 14.28.29325                                       msi
Java(TM) SE Development Kit... 18.0.2.1         C:\Program Files\Java\jdk-18.... msi
...                            ...              ...                              ...
...                            ...              ...                              ...
...                            ...              ...                              ...

您可能需要找出指定软件的安装位置;在这种情况下,我们将 Get-PackageSelect-Object cmdlet 结合使用,如下所示。

将 Get-Package 与 Select-Object Cmdlet 结合使用:

$software = "Java(TM) SE Development Kit 18.0.2.1 (64-bit)"
Get-Package -Name $software | Select-Object -ExpandProperty Source

输出 :

C:\Program Files\Java\jdk-18.0.2.1\

我们已经了解了Get-PackageSelect-Object;新的东西是 -ExpandProperty 参数,我们用它来指定我们想要选择的属性。因此,例如,在上面的代码围栏中,我们选择了 source 属性来了解指定 $software 的安装位置。

Get-WmiObjectSelect-Object Cmdlet 结合使用

Get-WmiObjectSelect-Object cmdlet 结合使用来检查是否安装了指定的软件。

将 Get-WmiObject 与 Select-Object 结合使用:

$software = "Java(TM) SE Development Kit 18.0.2.1 (64-bit)"
Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -eq $software } | Select-Object $software

输出 :

Java(TM) SE Development Kit 18.0.2.1 (64-bit)

此示例与上一节中的第一个示例类似,但我们在上面的代码片段中使用了带有 -Class 参数的 Get-WmiObject cmdlet。此 cmdlet 检索 WMI(Windows 管理规范)类的所有实例或有关可用类的信息。

将此 cmdlet 用作 Get-WmiObject -Class Win32_Product 返回使用 WMI 的 Windows 系统上所有已安装软件的列表。我们可以在任何安装了 PowerShell 的 Windows 系统上运行此命令,并获取所有已安装软件包的详细信息,包括软件的名称、供应商、版本和其他重要信息。

请记住,使用 Get-WmiObject 可能会很慢并且占用资源,特别是当我们的系统安装了许多软件/软件包时。为什么慢?这是因为它必须查询 WMI 数据库以查找每个已安装的软件。此外,很少有防病毒软件会将其识别为恶意命令,因为恶意软件经常使用它来收集有关特定系统上已安装软件包的信息。您必须小心使用此功能,并且只能在受信任的系统上使用。

现在,我们修改上面的代码,如下所示。

将 Get-WmiObject 与 Select-Object 结合使用:

$software = "Java(TM) SE Development Kit 18.0.2.1 (64-bit)"
$result = Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name = '$software'"
if ($result -ne $null){
    Write-Host "'$software' is installed."
}
else{
    Write-Host "'$software' is not installed."
}

输出 :

'Java(TM) SE Development Kit 18.0.2.1 (64-bit)' is installed.

在这里,我们使用 Get-WmiObject 命令返回的值初始化 $result 变量。接下来,我们使用带有 -ne 运算符的 if 语句来检查 $result 是否不等于 $null代码>;如果没有,我们使用 Write-Host 显示一条自定义消息,通知指定的软件已安装;否则,else 块将被执行。

现在我们知道了 Get-WmiObject cmdlet、我们为什么使用它以及它返回什么。让我们使用另一个代码示例,但这次带有函数。

Get-WmiObject 如何查询数据库的演示:

function Check_Software_Installed( $software ) {
$wmi_check = (Get-WmiObject -Query "SELECT * FROM Win32_Product Where Name='$software'")
return $wmi_check;
}
Check_Software_Installed("Java(TM) SE Development Kit 18.0.2.1 (64-bit)")

输出 :

IdentifyingNumber : {F3A2A837-F83B-5732-97F2-309BE0F51E0C}
Name              : Java(TM) SE Development Kit 18.0.2.1 (64-bit)
Vendor            : Oracle Corporation
Version           : 18.0.2.1
Caption           : Java(TM) SE Development Kit 18.0.2.1 (64-bit)

我们得到了 VendorVersionCaptionNameIdentifyingNumber 因为我们使用了SQL SELECT 命令中的 *。因此,我们可以获得所有已安装软件包的相同信息,如下所示。

使用 Get-WmiObject Cmdlet:

Get-WmiObject -Class Win32_Product

输出 :

IdentifyingNumber : {89581302-705F-42C5-99B0-E368A845DAD5}
Name              : Microsoft Update Health Tools
Vendor            : Microsoft Corporation
Version           : 3.70.0.0
Caption           : Microsoft Update Health Tools

IdentifyingNumber : {7B9BAA62-C960-4309-A639-28FC9877FF68}
Name              : Node.js
Vendor            : Node.js Foundation
Version           : 18.12.1
Caption           : Node.js

IdentifyingNumber : {F3A2A837-F83B-5732-97F2-309BE0F51E0C}
Name              : Java(TM) SE Development Kit 18.0.2.1 (64-bit)
Vendor            : Oracle Corporation
Version           : 18.0.2.1
Caption           : Java(TM) SE Development Kit 18.0.2.1 (64-bit)
...               ...
...               ...
...               ...

使用 Get-ChildItem Cmdlet

要在 PowerShell 中检查所有已安装的软件:

  • 使用 Get-ChildItem cmdlet 查询注册表以检索所有已安装软件包(软件)的列表。
  • 使用 ForEach 循环遍历已安装软件包的列表。
  • 在每次迭代中:

    • 使用Write-Host三次来显示软件的DisplayName、分隔符和DisplayVersion

使用 Get-ChildItem Cmdlet:

$installedSoftware = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall"
foreach($object in $installedSoftware){
    Write-Host $object.GetValue('DisplayName') -NoNewline;
    Write-Host " - " -NoNewline;
    Write-Host $object.GetValue('DisplayVersion')
}

输出 :

Greenshot 1.2.10.6 - 1.2.10.6
Apache NetBeans IDE 15 - 15
Notepad++ (64-bit x64) - 8.4.4
Microsoft 365 Apps for enterprise - en-us - 16.0.16130.20218
Microsoft OneDrive - 23.038.0219.0001
R for Windows 4.2.1 - 4.2.1
WinRAR 6.11 (64-bit) - 6.11.0
XAMPP - 8.1.6-0
Python 3.10.6 Development Libraries (64-bit) - 3.10.6150.0
Python 3.11.0 pip Bootstrap (64-bit) - 3.11.150.0
Python 3.10.6 Test Suite (64-bit) - 3.10.6150.0
Python 3.10.6 Utility Scripts (64-bit) - 3.10.6150.0
Python 3.11.0 Core Interpreter (64-bit) - 3.11.150.0
Microsoft Visual C++ 2019 X64 Additional Runtime - 14.28.29325 - 14.28.29325
Typora 1.4 - 1.4.3
Python 3.10.6 pip Bootstrap (64-bit) - 3.10.6150.0
Python 3.10.6 Documentation (64-bit) - 3.10.6150.0
Python 3.10.6 Add to Path (64-bit) - 3.10.6150.0
Oracle VM VirtualBox 7.0.6 - 7.0.6
Windows PC Health Check - 3.6.2204.08001
Python 3.11.0 Tcl/Tk Support (64-bit) - 3.11.150.0
Python 3.11.0 Development Libraries (64-bit) - 3.11.150.0
Python 3.10.6 Executables (64-bit) - 3.10.6150.0
Node.js - 18.12.1
Microsoft Visual C++ 2019 X64 Minimum Runtime - 14.28.29325 - 14.28.29325
Update for Windows 10 for x64-based Systems (KB5001716) - 4.91.0.0
Microsoft Update Health Tools - 3.70.0.0
Office 16 Click-to-Run Licensing Component - 16.0.16130.20218
Office 16 Click-to-Run Extensibility Component - 16.0.16130.20218
Python 3.10.6 Tcl/Tk Support (64-bit) - 3.10.6150.0
Python 3.11.0 Add to Path (64-bit) - 3.11.150.0
Python 3.11.0 Executables (64-bit) - 3.11.150.0
ScreenToGif - 2.37.1
Python 3.11.0 Utility Scripts (64-bit) - 3.11.150.0
Python 3.10.6 Standard Library (64-bit) - 3.10.6150.0
Python 3.10.6 Core Interpreter (64-bit) - 3.10.6150.0
Python 3.11.0 Standard Library (64-bit) - 3.11.150.0
Python 3.11.0 Documentation (64-bit) - 3.11.150.0
Python 3.11.0 Test Suite (64-bit) - 3.11.150.0
Java(TM) SE Development Kit 18.0.2.1 (64-bit) - 18.0.2.1

我们使用 Get-ChildItem 查询注册表并获取本地计算机上所有已安装的软件。我们将此列表存储在 $installedSoftware 变量中,并与 ForEach 循环一起使用。该循环遍历 $installedSoftware,并且我们对列表中的每个元素使用 Write-Host cmdlet 三次。

首先,Write-Host 用于打印使用 GetValue() 方法检索到的当前软件的 DisplayName。第二个 Write-Host cmdlet 用于打印分隔符;我们使用了-;您可以使用您的任何选择。第三,Write-Host打印了当前软件的DisplayVersion,这是我们通过GetValue()方法获得的。最后,使用-NoNewLine不插入换行符。

上面的代码列出了本地计算机上安装的所有软件,但应用程序也可以按用户安装。因此,要获取当前登录用户的软件列表,我们必须将 HKLM 更改为 HKCU,如下所示。因此,这里,LM 表示本地计算机,而 CU 表示当前用户。

使用 Get-ChildItem Cmdlet:

$installedSoftware = Get-ChildItem "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall"
foreach($object in $installedSoftware){
    Write-Host $object.GetValue('DisplayName') -NoNewline;
    Write-Host " - " -NoNewline;
    Write-Host $object.GetValue('DisplayVersion')
}

输出 :

Microsoft Teams - 1.5.00.21668
Zoom - 5.13.3 (11494)
Python 3.10.6 (64-bit) - 3.10.6150.0
Telegram Desktop - 4.4
Microsoft Visual Studio Code (User) - 1.74.3
Python 3.11.0 (64-bit) - 3.11.150.0

要以表格形式获取信息,我们可以使用以下解决方案。

将 Get-ItemProperty Cmdlet 与 Select-Object 结合使用:

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

输出 :

DisplayName                        DisplayVersion Publisher                  InstallDate
-----------                        -------------- ---------                  -----------
Google Chrome                      111.0.5563.64  Google LLC                 20230310
Microsoft Edge                     110.0.1587.63  Microsoft Corporation      20230304
Microsoft Edge WebView2 Runtime    110.0.1587.63  Microsoft Corporation      20230306
Python Launcher                    3.11.7966.0    Python Software Foundation 20221108
Teams Machine-Wide Installer       1.5.0.8070     Microsoft Corporation      20220916
...                                ...            ...                        ...
...                                ...            ...                        ...

我们使用 Get-ItemProperty cmdlet 检索所选对象的 DisplayNameDisplayVersionPublisherInstallDate 属性。相比之下,Format-Table cmdlet 用于以表格格式显示接收到的数据。

这就是如何检查软件是否已安装的全部内容。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯