我需要检查计算机上是否安装了软件。我尝试了WMIC查询,但不适用于所有软件。
我在线搜索以找到解决方案,并在PS代码下面找到了,效果很好。出于对代码原始作者的尊重,我试图将其塑造成符合我的要求的方法-由于我不了解此代码中对象数组的使用,因此无法做到这一点。
当我检查$Insdetails
的值时,我得到:
现在,我想使用displayverison
访问信息$insdetails.displayversion
,并且该操作不会返回任何信息。
我知道我缺少基本原则,但希望了解如何处理这种情况。我在Powershell方面比较新鲜,需要有关此问题的专家指导,请教育我以了解细微差别。
$computername = $env:computername
$uninstallKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
$reg = [microsoft.win32.registrykey]::OpenRemoteBaseKey('LocalMachine', $computername)
$regkey = $reg.OpenSubKey($UninstallKey)
$subkeys = $regkey.GetSubKeyNames()
$array = @()
foreach ($key in $subkeys) {
$thisKey = $UninstallKey + "\\" + $key
$thisSubKey = $reg.OpenSubKey($thisKey)
$obj = New-Object PSObject
$obj | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $computername
$obj | Add-Member -MemberType NoteProperty -Name "DisplayName" -Value $($thisSubKey.GetValue("DisplayName"))
$obj | Add-Member -MemberType NoteProperty -Name "DisplayVersion" -Value $($thisSubKey.GetValue("DisplayVersion"))
$obj | Add-Member -MemberType NoteProperty -Name "InstallLocation" -Value $($thisSubKey.GetValue("InstallLocation"))
$obj | Add-Member -MemberType NoteProperty -Name "Publisher" -Value $($thisSubKey.GetValue("Publisher"))
$array += $obj
}
$InsDetails = ($array | Where-Object { $_.Displayname -like '*vlc*' } | select ComputerName, DisplayName, DisplayVersion, Publisher | ft -auto)
答案 0 :(得分:4)
您遇到的问题是因为在上一个命令的末尾您有| ft -auto
。 FT
是Format-Table
的别名。当您将输出发送到Format-
cmdlet之一时,它会更改对象类型,除了将其重定向到文件或打印机或屏幕外,您无法再进一步处理该对象或其属性。 / p>
要执行所需的操作,只需删除| ft -auto
部分。