You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过PowerShell获取Office品牌版本(而非内部构建版本)

如何通过PowerShell获取Office品牌版本(而非内部构建版本)

我完全理解你想要获取的是像2302、2308这类的Office品牌版本号,而不是16.xxxx格式的内部构建版本号。你目前找到的网页抓取方法确实存在不小的隐患:网页结构随时可能变更,请求也容易出现超时或者被限制访问的情况,在正式脚本或部署包中使用风险很高。

下面给你两种更可靠的本地方案,完全不需要依赖外部网页:

方案一:从Office注册表项读取(推荐)

大多数Click-to-Run类型的Office安装会把版本信息存在注册表中,直接读取相关键值稳定性拉满:

# 针对64位Office的注册表路径,32位Office请改为"HKLM:\SOFTWARE\Wow6432Node\Microsoft\Office\ClickToRun\Configuration"
$officeRegPath = "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration"

if (Test-Path $officeRegPath) {
    # 从CDN路径中提取品牌版本(比如路径末尾的2302就是品牌版本)
    $brandVersion = (Get-ItemProperty -Path $officeRegPath -Name "CDNBaseUrl").CDNBaseUrl.Split('/')[-2]
    # 同时获取官方上报的构建版本
    $buildVersion = (Get-ItemProperty -Path $officeRegPath -Name "VersionToReport").VersionToReport

    [PSCustomObject]@{
        品牌版本 = $brandVersion
        构建版本 = $buildVersion
    }
} else {
    Write-Warning "未找到Office Click-to-Run注册表项,请检查Office是否为点击运行版,或调整注册表路径"
}

方案二:通过Office COM对象获取

如果你需要验证当前激活的Office应用版本,可以通过COM对象读取(需要本地安装Office应用):

try {
    # 创建Excel COM对象(也可以用Word、PowerPoint等)
    $excelApp = New-Object -ComObject Excel.Application
    $excelApp.Visible = $false

    # 获取完整构建号
    $fullBuild = $excelApp.Build
    # 从构建号中匹配品牌版本(可根据需要扩展更多版本映射)
    $brandVersion = switch -Wildcard ($fullBuild) {
        "*2302*" { "2302" }
        "*2308*" { "2308" }
        "*2402*" { "2402" }
        default { "无法识别的品牌版本" }
    }

    [PSCustomObject]@{
        品牌版本 = $brandVersion
        完整构建号 = $fullBuild
        Office主版本号 = $excelApp.Version
    }

    # 清理COM对象,避免残留进程
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excelApp) | Out-Null
    Remove-Variable excelApp
} catch {
    Write-Warning "无法创建Office COM对象:$($_.Exception.Message),请确保已安装Office桌面应用"
}

如果你确实需要临时使用网页抓取的方案,建议添加超时和错误捕获来降低风险:

try {
    # 设置10秒超时,避免无限等待
    $content = Invoke-RestMethod -Uri "https://docs.microsoft.com/en-us/officeupdates/update-history-office365-proplus-by-date" -Method Get -TimeoutSec 10
    $targetBuild = [Version]"16.0.12026.20264"

    if ($content -match "<a href=`"(?<Channel>.+?)`".+?>Version (?<Version>\d{4}) \(Build $($targetBuild.Build)\.$($targetBuild.Revision)\)") {
        $output = [PSCustomObject]@{
            Build = $targetBuild
            Version = $Matches['Version']
            Channel = ($Matches['Channel'] -split "#")[0]
        }
        Write-Output $output
    } else {
        Write-Warning "未匹配到对应版本信息,可能网页结构已更新"
    }
} catch {
    Write-Warning "网页请求失败:$($_.Exception.Message)"
}

不过还是强烈建议优先使用本地读取的方案,彻底规避外部依赖带来的不稳定问题。

备注:内容来源于stack exchange,提问作者François Racine

火山引擎 最新活动