PowerShell对比EXE与MSI版本号始终匹配失败问题求助
问题根因
- 你当前使用的
-match是正则匹配运算符,一方面存在特殊字符误判的风险,另一方面你获取的MSI版本字符串可能带有COM调用返回的不可见字符、首尾空格,会直接导致匹配失败。 - 两段版本号段数不一致:exe的文件版本是4段结构(主版本.次版本. Build版本.修订号),而MSI的
ProductVersion属性默认仅存储前3段,直接全字符串匹配无法对齐。
修复方案
最稳妥的方案是将两个版本转换为PowerShell原生的[version]强类型对象,按需对比指定的版本段即可,同时对MSI返回的版本字符串做去空格处理:
第一步:优化MSI版本获取逻辑
修改Get-MsiDBVersion函数的返回值,去掉首尾空白字符:
# 原函数其他代码不变,仅修改return行 return $productVersion.Trim()
第二步:修改版本对比逻辑
# 转换为强类型版本对象 $exeVersion = [version](Get-Item "C:\Program Files\Dell\SysMgt\rac5\racadm.exe").VersionInfo.FileVersion $msiVersion = [version]$RACToolsVersion # 对比前3段版本即可对齐MSI的版本规则 if ($exeVersion.Major -eq $msiVersion.Major -and $exeVersion.Minor -eq $msiVersion.Minor -and $exeVersion.Build -eq $msiVersion.Build) { Write-Host "yes match" } else { Write-Host "no match" }
如果需要实现「MSI版本更高时自动安装」的逻辑,还可以直接用版本对象对比大小:
# 截取exe的前3段构造相同长度的版本对象 $exeShortVersion = [version]"$($exeVersion.Major).$($exeVersion.Minor).$($exeVersion.Build)" if ($msiVersion -gt $exeShortVersion) { Write-Host "MSI版本更新,开始执行安装逻辑" # 此处补充MSI安装命令即可 } else { Write-Host "当前已安装版本为最新,无需更新" }
内容的提问来源于stack exchange,提问作者Fitzgery
相关产品推荐
相关产品推荐

