PowerShell脚本开发:遍历筛选最新build_info文件并对比版本
我刚好做过类似的需求,这就给你一个实用的PowerShell脚本方案,完全覆盖你提到的所有功能:
实现逻辑拆解
先理清楚核心步骤,方便你理解和调整:
- 定义需要检查的服务器安装路径集合
- 逐个路径检查:先确认路径存在,再找到其中最新的
build_info文件 - 从每个有效文件中提取
version:后的版本号,处理可能的空格问题 - 用哈希表存储每个路径对应的版本(比单独定义变量更灵活,也能满足“独立关联”的需求)
- 最后对比所有有效版本,输出一致结果或差异详情
完整PowerShell脚本
# 定义需要检查的服务器安装路径集合,根据你的实际情况修改 $targetPaths = @( "D:\ServerApps\PaymentService", "D:\ServerApps\UserAuth", "E:\Deploy\OrderSystem", "E:\Deploy\Inventory" ) # 初始化哈希表,用来存储每个路径对应的版本(相当于路径和版本的映射表) $pathVersionMap = @{} # 遍历每个目标路径,处理版本提取逻辑 foreach ($path in $targetPaths) { # 先检查当前路径是否存在 if (-not (Test-Path -Path $path -PathType Container)) { Write-Warning "⚠️ 路径 $path 不存在,跳过该路径检查" $pathVersionMap[$path] = "路径不存在" continue } # 查找当前路径下所有build_info文件,按最后修改时间倒序,取最新的一个 $latestBuildInfo = Get-ChildItem -Path $path -Filter "build_info" -Recurse -File | Sort-Object LastWriteTime -Descending | Select-Object -First 1 # 未找到build_info文件的情况处理 if (-not $latestBuildInfo) { Write-Warning "⚠️ 路径 $path 未找到build_info文件,跳过该路径检查" $pathVersionMap[$path] = "未找到build_info文件" continue } # 读取文件内容,用正则提取version字段 $fileContent = Get-Content -Path $latestBuildInfo.FullName -Raw if ($fileContent -match 'version:\s*(.+)') { $extractedVersion = $matches[1].Trim() $pathVersionMap[$path] = $extractedVersion Write-Host "✅ 已提取路径 $path 的版本:$extractedVersion" } else { Write-Warning "⚠️ 路径 $path 的build_info文件中未找到version字段" $pathVersionMap[$path] = "未找到version字段" } } # 版本一致性检查与结果输出 $validVersions = $pathVersionMap.Values | Where-Object { $_ -notmatch "路径不存在|未找到" } $uniqueValidVersions = $validVersions | Get-Unique if ($uniqueValidVersions.Count -eq 1) { Write-Host "`n🎉 所有有效路径的版本完全一致!统一版本号:$($uniqueValidVersions[0])" } else { Write-Host "`n❌ 发现版本不一致,各路径对应版本详情:" foreach ($entry in $pathVersionMap.GetEnumerator()) { Write-Host " - 路径:$($entry.Key) | 版本:$($entry.Value)" } }
额外说明:关于“独立变量”的需求
如果你确实需要为每个路径创建独立的PowerShell变量(比如$PaymentServiceVersion、$UserAuthVersion),可以在提取版本后添加这段代码:
# 根据路径最后一段生成变量名,比如路径D:\ServerApps\PaymentService会生成$PaymentServiceVersion $variableSuffix = ($path -split '[\\:]')[-1] $variableName = "${variableSuffix}Version" # 创建脚本级别的变量,确保后续可以访问 New-Variable -Name $variableName -Value $extractedVersion -Scope Script
不过更推荐用脚本里的哈希表$pathVersionMap,它更便于批量处理和查询,尤其当路径数量变化时不需要修改变量定义逻辑。
内容的提问来源于stack exchange,提问作者Jeremiah Williams
相关产品推荐
相关产品推荐

