我正在尝试创建一个非常简单的脚本,该脚本将检查是否安装了特定程序,如果已安装,则返回该程序的版本号。
我已经到达运行脚本的地步,并且无论是否安装了程序都可以返回二进制值,但是不确定如何返回已安装程序的版本号。
>如果安装了程序,我将要返回的内容就是我要做的事情,并且需要帮助才能获得版本号。
function Check_Program_Installed {
$my_check = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, InstallDate |
Format-Table -AutoSize |
Out-String
# Check if Google Chrome is installed
$my_check -Match "Google Chrome"
}
Check_Program_Installed
答案 0 :(得分:3)
function Get-InstalledProgram {
Param (
$ProgramName
)
$UninstallKeys = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*
if ( $ProgramName )
{
$UninstallKeys | Where-Object -Property DisplayName -Match -Value $ProgramName | Select-Object DisplayName, DisplayVersion, InstallDate
}
else
{
$UninstallKeys | Select-Object DisplayName, DisplayVersion, InstallDate
}
}
如果要查看所有程序,则不必添加参数。只需将其输出传递到Format-Table
。 Format-Table在项目不再是您期望的对象,而是表对象的地方做了一些奇怪的事情。这是我的处理方式:
Get-InstalledProgram | Format-Table -Autosize
如果要搜索程序,请添加参数。您将在上方看到我为ProgramName添加了一个参数。它将与注册表项的DisplayName相匹配。
PS C:\> Get-InstalledProgram -ProgramName Java
DisplayName DisplayVersion InstallDate
----------- -------------- -----------
Java 8 Update 181 8.0.1810.25 20180725
Java Auto Updater 2.8.181.13 20180925
如果您只想获取版本,我建议您仅将输出传递到Select-Object -ExpandProperty DisplayVersion
PS C:\> Get-InstalledProgram -ProgramName 'Java 8' | Select-Object -ExpandProperty DisplayVersion
8.0.1810.25
答案 1 :(得分:3)
代替格式化表格后进行匹配,您可以添加一个位置来预先选择所需的结果,然后直接从该对象获取DisplayVersion
。您可以清理更多内容以完全完成所需的操作,但是如果发现了应用程序,则可以对代码进行修改以检索并显示编号。尝试切换到错误名称以查看else
结果:
function Check_Program_Installed {
$applicationName = "Google Chrome"
$my_check = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, InstallDate | Where -Property DisplayName -Match $applicationName
$versionNumber = $my_check.DisplayVersion
if ($my_check) {
$versionNumber
}
else {
write-warning "Application not found"
}
}
Check_Program_Installed
答案 2 :(得分:2)
如果您希望该函数查找特定的已安装程序,而不是返回(表)格式的字符串,则只需执行以下操作:
function Check_Program_Installed {
[CmdletBinding()]
Param(
[Parameter(Position = 0, Mandatory=$true, ValueFromPipeline = $true)]
$Name
)
$app = Get-ItemProperty -Path "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" |
Where-Object { $_.DisplayName -match $Name } |
Select-Object DisplayName, DisplayVersion, InstallDate, Version
if ($app) {
return $app.DisplayVersion
}
}
Check_Program_Installed "Google Chrome"
找不到时将返回$null
,或者返回类似字符串70.0.3538.67
的版本
答案 3 :(得分:1)
tl; dr
在Windows PowerShell [1] v5 + 中,使用以下内容(在 32位和64位已安装程序中进行搜索,在控制面板中显示):
Get-Package -ProviderName Programs -IncludeWindowsInstaller |
Where-Object Name -like '*Google Chrome*' | ForEach-Object Version
注意:仅32位的HKEY_LOCAL_MACHINE:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
可能比控制面板显示的条目更具体-我不清楚原因,但也许控制面板中的组合视图就足够了。
包装在简单函数中,该函数返回完整的对象:
function Get-InstalledProgram ([string] $NamePart) {
Get-Package -ProviderName Programs -IncludeWindowsInstaller |
Where-Object Name -like ('*' + $NamePart + '*')
}
没有-NamePart
自变量,将输出所有安装的程序。
-NamePart
参数可以是程序名称的任何子字符串,因为提供的字符串包含在函数内部的*...*
中并与-like
匹配;请注意,可能有多个条目匹配。
可以在this Gist中找到此功能的更复杂版本,它支持多个名称子字符串。
应用于您的示例:
PS> (Get-InstalledProgram 'Google Chrome').Version
70.0.3538.67
由于您要专门检查Wow6432Node
注册表项分支,因此只检查已安装的 32位程序。
因此,为您的函数命名的更好名称是Check_32BitProgram_Installed
,或者更符合函数意图的名称是Get-32BitProgramVersion
。
鉴于您问题的通用标题,以上内容是一种解决方案,实际上可以搜索在控制面板>程序>程序和功能(appwiz.cpl
)中看到的已安装应用程序列表,该列表涵盖了32位和64位应用程序:
Windows PowerShell v5 + 随附 PackageManagement
模块和 Programs
软件包提供程序 [1 ] 允许通过Get-Package
cmdlet检查已安装的程序;在PSv3和PSv4中,它是available as a download。
要列出已安装的程序(以节略的示例输出显示):
PS> Get-Package -ProviderName Programs -IncludeWindowsInstaller
Name Version Source ProviderName
---- ------- ------ ------------
Git version 2.18.0 2.18.0 Programs
Microsoft Azure Compute Emu... 2.9.8699.20 Programs
Microsoft Azure Authoring T... 2.9.8699.20 Programs
# ...
输出对象的类型为[Microsoft.PackageManagement.Packaging.SoftwareIdentity]
,具有.Name
和.Version
属性,可以启用上述解决方案。
Programs
程序包提供程序支持两个动态选项(特定于该提供程序的选项):
-IncludeWindowsInstaller
才能使报告的程序列表与控制面板显示的内容匹配。
-IncludeSystemComponent
报告在控制面板中未显示 的组件。
[1]不幸的是,底层的Programs
软件包提供程序在v6的Windows的PowerShell Core 中 不可用。 1.0-目前尚不清楚这是不是一种情况还是永远不会发生。