PowerShell构建版本管理:实现版本号自动递增与外部文件更新需求问询
我帮你梳理了完整的解决方案,涵盖外部版本文件的读写、版本号递增逻辑,以及和你现有ChooseVersion函数的整合。下面是分步实现细节:
1. 准备外部版本存储文件
先创建一个VersionStore.ps1文件(路径可根据实际需求调整),用来持久化存储版本变量,格式沿用你给出的PowerShell变量形式,方便脚本直接加载:
# VersionStore.ps1 $ReleaseVersion1 = "8.5.34.31.4" $ReleaseVersion2 = "8.5.34.35.4" $ReleaseVersion3 = "8.6.22.607.8" $ReleaseVersion4 = "8.6.22.2000.8"
2. 添加版本读写辅助函数
这两个函数负责从外部文件加载版本数据,以及将更新后的版本写回文件,确保其他版本变量不受影响:
# 加载外部版本文件,返回包含所有ReleaseVersion变量的哈希表 function Load-VersionStore { param( [string]$Path ) # 使用dot source将外部文件的变量导入当前会话 . $Path return @{ ReleaseVersion1 = $ReleaseVersion1 ReleaseVersion2 = $ReleaseVersion2 ReleaseVersion3 = $ReleaseVersion3 ReleaseVersion4 = $ReleaseVersion4 } } # 将更新后的版本写入外部文件 function Save-VersionStore { param( [string]$Path, [hashtable]$UpdatedVersions ) $content = Get-Content -Path $Path -Raw # 遍历需要更新的变量,用正则精准替换对应行 foreach ($key in $UpdatedVersions.Keys) { $oldValue = [regex]::Escape((Get-Variable -Name $key -ValueOnly)) $newValue = [regex]::Escape($UpdatedVersions[$key]) $content = $content -replace "`$$key = `"$oldValue`"", "`$$key = `"$newValue`"" } Set-Content -Path $Path -Value $content -Force }
3. 修改ChooseVersion函数,整合递增逻辑
更新你原有的函数,让它从外部加载版本、处理用户选择、完成版本号递增并保存:
function ChooseVersion() { # 替换为你的实际版本存储文件路径 $versionStorePath = "C:\YourScriptPath\VersionStore.ps1" # 替换为你的实际共享驱动器路径 $SharedDriveFolderPath = "\\YourSharedDrive\Path" # 加载外部版本数据 $versionStore = Load-VersionStore -Path $versionStorePath # 构建版本列表(从外部加载版本,不再硬编码) $Versions = @() $Versions += "ReleaseVersion;Sourceversion;Versionlocationforpatches;Versionlocationforcabs;LinkForVersion;VersionNumber;buildver;PipelineID;xmlFilePath;ReleaseBuildVer" $Versions += "$($versionStore.ReleaseVersion1);$SharedDriveFolderPath\Versions\8.5.34.31;$SharedDriveFolderPath\Versions\8.5.34.31\Installer\Patches;$SharedDriveFolderPath\Versions\8.5.34.31\Installer;\\bandit.com\global\builds\Releases\RingOne Builds\8.5 RingOne\$($versionStore.ReleaseVersion1);8.5.34.31;8.5.34.31;18710;$SharedDriveFolderPath\Versions\8.5.34.31\BuildDescription.xml;$($versionStore.ReleaseVersion1)" $Versions += "$($versionStore.ReleaseVersion2);$SharedDriveFolderPath\Versions\8.5.34.35;$SharedDriveFolderPath\Versions\8.5.34.35\Installer\Patches;$SharedDriveFolderPath\Versions\8.5.34.35\Installer;\\bandit.com\global\builds\Releases\RingOne Builds\8.5 RingOne\$($versionStore.ReleaseVersion2);8.5.34.35_Federal;8.5.34.35;18713;$SharedDriveFolderPath\Versions\8.5.34.35\BuildDescription.xml;$($versionStore.ReleaseVersion2)" $Versions += "$($versionStore.ReleaseVersion3);$SharedDriveFolderPath\Versions\8.6.22.607;$SharedDriveFolderPath\Versions\8.6.22.607\Installer\Patches;$SharedDriveFolderPath\Versions\8.6.22.607\Installer;\\bandit.com\global\builds\Releases\RingOne Builds\8.6 RingOne\$($versionStore.ReleaseVersion3);8.6.22.607;8.6.22.607;18650;$SharedDriveFolderPath\Versions\8.6.22.607\BuildDescription.xml;$($versionStore.ReleaseVersion3)" $Versions += "$($versionStore.ReleaseVersion4);$SharedDriveFolderPath\Versions\8.6.22.2000;$SharedDriveFolderPath\Versions\8.6.22.2000\Installer\Patches;$SharedDriveFolderPath\Versions\8.6.22.2000\Installer;\\bandit.com\global\builds\Releases\RingOne Builds\8.6 RingOne\$($versionStore.ReleaseVersion4);8.6.22.2000_Federal;8.6.22.2000;18667;$SharedDriveFolderPath\Versions\8.6.22.2000\BuildDescription.xml;$($versionStore.ReleaseVersion4)" $Versions = $Versions | ConvertFrom-CSV -Del ";" # 让用户选择目标版本 do { $VersionToUse = $Versions.VersionNumber | Out-Gridview -Title "Choose version for initialization" -PassThru } while ($Versions.VersionNumber -notcontains $VersionToUse) # 匹配选中版本对应的ReleaseVersion变量和值 $selectedReleaseVersion = ($Versions | Where-Object {$_.VersionNumber -eq $VersionToUse}).ReleaseVersion $versionVariableName = $versionStore.GetEnumerator() | Where-Object {$_.Value -eq $selectedReleaseVersion} | Select-Object -ExpandProperty Key # 版本号递增:拆分最后一位数字加1,重新拼接 $versionParts = $selectedReleaseVersion -split "\." $lastPart = [int]$versionParts[-1] $versionParts[-1] = ($lastPart + 1).ToString() $newReleaseVersion = $versionParts -join "." # 更新版本存储并写入外部文件 Save-VersionStore -Path $versionStorePath -UpdatedVersions @{$versionVariableName = $newReleaseVersion} # 原有变量赋值逻辑,替换为递增后的版本值 $Versionlocationforpatches = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).Versionlocationforpatches $Versionlocationforcabs = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).Versionlocationforcabs $ReleaseVersion = $newReleaseVersion $Sourceversion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).Sourceversion $LinkForVersion = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).LinkForVersion -replace $selectedReleaseVersion, $newReleaseVersion $VersionNumber = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).VersionNumber $buildver = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).buildver $PipelineID = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).PipelineID $xmlFilePath = ($Versions | where {$_.VersionNumber -eq $VersionToUse}).xmlFilePath $ReleaseBuildVer = $newReleaseVersion Write-host "You decided to initialize parameters for version '$VersionToUse'" -ForegroundColor Cyan Write-host "Updated release version to: $newReleaseVersion" -ForegroundColor Green }
4. 关键逻辑说明
- 版本加载:通过
dot source操作将外部文件的变量导入脚本会话,同时用哈希表存储便于快速查找。 - 版本匹配:当用户选中
8.6.22.607时,会自动关联到$ReleaseVersion3变量(因为其值为8.6.22.607.8)。 - 递增逻辑:拆分版本号为数组,将最后一位转为整数加1后重新拼接,确保版本号格式不变。
- 文件写入:用正则精准替换目标变量的行,保证其他版本数据不受修改影响。
内容的提问来源于stack exchange,提问作者Bandit
相关产品推荐
相关产品推荐

