我需要提示如何从已安装的MSI中获取升级代码。实际上我有产品代码,可以从HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
检索。
现在我想从HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes
检索升级代码(基于产品代码)。
我的问题是产品代码用作值名称,这意味着我有一个REG_SZ
,其中名称是产品代码guid,值为空。
检索产品代码的一种方法可能是:
PS HKLM:\SOFTW...Codes> Get-ItemProperty * | select -First 1 | gm TypeName: System.Management.Automation.PSCustomObject Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() 42F79228D77BA4A4EB5150F3DC090CE3 NoteProperty System.String 42F79228D77BA4A4EB5150F3DC090CE3= ...
如何检查PSCustomObject
是否包含属性42F79228D77BA4A4EB5150F3DC090CE3
?
有谁知道是否有更优雅的方式?
答案 0 :(得分:1)
这是你可以检查的方法。致力于优雅的解决方案...
$properties = Get-ItemProperty * | select -first 1 | Get-Member | Where-object {$_.MemberType -eq "NoteProperty"}
if("42F79228D77BA4A4EB5150F3DC090CE3" -in $properties.Name){
Write-Output "It's in there!"
}
修改强>
这更优雅一点。它转到HKLM
路径,并检查与代码相同的PSChildName
(注册表项)。
如果找到,它将返回Name和property。如果找不到,变量$codeExists
将为$null
。
$code = "42F79228D77BA4A4EB5150F3DC090CE3"
$codeExists = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes" | Where-Object {$_.PSChildName -eq $code}
if($codeExists){
Write-Output "It's in there!"
}