获取指定程序的当前版本号

时间:2018-06-04 20:48:57

标签: powershell wmi wmi-query

我是根据朋友的推荐开始的。

Get-WmiObject win32_product | ft name, version

但后来我发现了this,这让我暂停了。 一点研究让我想到了这个

wmic product where "Name='Revit 2018'" get name,version

对收集的数据起作用。是的,我在这个例子中寻找一个不同的程序。在任何情况下,一旦我使用WMIC获得了良好的信息,我试图将数据转换为变量,这样我就可以得到版本号,但数据格式化是我以前从未见过的。我希望有一个简单的解决方案,比如

$object = wmic product where "Name='Revit 2018'" get name,version
$object.version

但只有结果是一个包含6个项目的数组,并且只有一个似乎是实际的数据行,而且这是一行,而不是两个属性。而且,我真的想知道一个旧的命令行实用程序是否正确答案。如果它真的是最好的方法,那么将原始数据转换为更多的东西是有技巧吗?PowerShelly?如果它不是获取此信息的最佳方式,那么它是什么?这个可怕的链接是真的,还是Get-WmiObject win32_product实际上是安全的?如果是这样,有没有办法过滤特定的名称,以加快速度?事实上,Get-WmiObject并没有像我期望的那样工作,如

$object = Get-WmiObject win32_product | ft name, version
foreach ($item in $object) {
    Write-Host "$($item.version)"
}

根本没有按预期工作。

编辑:这似乎按预期工作,这是进步。

$version = (Get-WmiObject win32_product -filter:"Name = 'Revit 2018'" | Select-Object -property:*).version
Write-Host "$version!"

我想问题是,这是一种安全且一致的方法,还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

为什么不使用注册表?

Set-Location HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
$app = Get-ChildItem | Where-Object { $_.GetValue("DisplayName") -match 'YourSoftware' }

$app.GetValue("DisplayVersion")

或者

Set-Location HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
$apps = Get-ChildItem
foreach ($app in $apps) {
  $app.GetValue("DisplayName","DisplayVersion")
}

注意:您还需要检查SysWow64注册表位置

HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ 

注意:并非所有项目都具有显示版本,在这种情况下,您始终可以选择在安装目录中查找可执行文件本身,该文件应具有版本。