如何通过PowerShell从注册表提取应用的MSI产品代码
提取MSI产品代码并完善卸载脚本
核心实现方案
要从MsiExec.exe /I{629388F2-A011-4F5C-A6BF-98A80A25317C}这类卸载字符串中提取{...}格式的产品代码,可通过正则匹配实现,同时修正脚本中变量传递的问题。以下是修改后的完整代码:
修改后的PowerShell脚本
# 定义需要遍历的注册表卸载路径 $paths = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall' # 查找目标应用并提取产品代码 $productCode = Get-ChildItem $paths | Where-Object { $_.GetValue('DisplayName') -match 'APP' } | ForEach-Object { $uninstallString = $_.GetValue('UninstallString') # 用正则匹配提取{GUID}格式的产品代码 if ($uninstallString -match '\{[0-9A-F-]+\}') { $matches[0] } } # 验证产品代码存在后执行卸载 if ($productCode) { doRemoveMSI -msi "msiexec.exe" -arguments '/x', $productCode, '/quiet', 'REBOOT=R', '/L*V "C:\msilog.log"' } else { Write-Warning "未找到目标APP的卸载产品代码" }
关键修改说明
- 正则提取逻辑:
\{[0-9A-F-]+\}精准匹配标准GUID格式的产品代码,不管卸载字符串是/I还是/X开头,都能正确提取目标内容。 - 变量传递修正:原脚本中
'$uninstallString'是字符串字面量,会直接传递$uninstallString文本而非变量值,改为直接使用$productCode即可传递实际提取到的产品代码。 - 增加有效性检查:避免因未找到目标APP导致卸载命令无意义执行,添加判断逻辑并输出警告提示。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

