PowerShell比较远程exe产品版本与指定值结果异常如何解决
问题根因
代码永远返回"updated"是两个核心逻辑错误导致的:
- 作用域错误。你把版本判断的if语句写在了
Invoke-Command的远程脚本块内部,这个脚本块运行在目标服务器的独立会话中:- 本地定义的
$versioupdated变量不会自动同步到远程会话,远程侧该变量值为$null - 脚本块内没有给
$version变量赋值,远程侧该变量值同样为$null
PowerShell中$null -eq $null永远返回$true,所以无论你怎么修改本地的目标版本值,判断结果永远成立,固定输出"updated"。
- 本地定义的
- 变量名拼写错误。本地定义目标版本时,你把
$versionUpdated错拼成了$versioupdated(漏了version中的字母n),后续在本地引用正确拼写的变量名会取不到值。 - 额外冗余逻辑:你查询的是固定路径的单个文件,不需要用
Get-ChildItem加ForEach-Object遍历,直接取文件对象读取属性即可。
修复代码
推荐把比较逻辑放在本地执行,远程只负责返回版本号,不需要处理跨会话传参,逻辑最清晰:
$servers = Get-Content -Path "C:\Temp\reviewfileversion\servers.txt" # 修正变量名,定义目标版本 $targetVersion = "16.11.32106.195" foreach ($server in $servers) { # 远程仅查询目标文件版本,直接返回结果 $currentVersion = Invoke-Command -ComputerName $server -ScriptBlock { (Get-Item "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\devenv.exe").VersionInfo.ProductVersion } # 本地做版本比对 if ($currentVersion -eq $targetVersion) { Write-Host "[$server] 版本已更新" } else { Write-Host "[$server] 版本未更新,当前版本:$currentVersion" } }
如果需要把判断逻辑放在远程侧执行,要用$using:作用域把本地变量传入远程会话,示例:
$servers = Get-Content -Path "C:\Temp\reviewfileversion\servers.txt" $targetVersion = "16.11.32106.195" foreach ($server in $servers) { Invoke-Command -ComputerName $server -ScriptBlock { $currentVersion = (Get-Item "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\devenv.exe").VersionInfo.ProductVersion if ($currentVersion -eq $using:targetVersion) { Write-Host "[$using:server] 版本已更新" } else { Write-Host "[$using:server] 版本未更新,当前版本:$currentVersion" } } }
注意事项
- 版本号是字符串类型,比较时必须加引号,直接写
16.11.32106.195属于非法数值格式,PowerShell无法正确解析。 - 如果需要判断版本是否高于/低于指定版本,不要直接用字符串比较,需要把两边的值转为
[Version]类型再对比,避免字符串逐位比较导致的结果错误,示例:if ([Version]$currentVersion -ge [Version]$targetVersion) {} - 你之前测试
-match、-like运算符不生效的原因和-eq一致:参与比较的两个值都是$null,无论用什么比较运算符,两个null的匹配结果都为真。
内容的提问来源于stack exchange,提问作者Xavier Muñoz
相关产品推荐
相关产品推荐

