我是根据朋友的推荐开始的。
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!"
我想问题是,这是一种安全且一致的方法,还是有更好的方法?
答案 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\
注意:并非所有项目都具有显示版本,在这种情况下,您始终可以选择在安装目录中查找可执行文件本身,该文件应具有版本。