如何通过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




