You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell比较远程exe产品版本与指定值结果异常如何解决

问题根因

代码永远返回"updated"是两个核心逻辑错误导致的:

  1. 作用域错误。你把版本判断的if语句写在了Invoke-Command的远程脚本块内部,这个脚本块运行在目标服务器的独立会话中:
    • 本地定义的$versioupdated变量不会自动同步到远程会话,远程侧该变量值为$null
    • 脚本块内没有给$version变量赋值,远程侧该变量值同样为$null
      PowerShell中$null -eq $null永远返回$true,所以无论你怎么修改本地的目标版本值,判断结果永远成立,固定输出"updated"。
  2. 变量名拼写错误。本地定义目标版本时,你把$versionUpdated错拼成了$versioupdated(漏了version中的字母n),后续在本地引用正确拼写的变量名会取不到值。
  3. 额外冗余逻辑:你查询的是固定路径的单个文件,不需要用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:01:03