如何在PowerShell GUI调用的XML文件中显示PowerShell工具的版本号
可行实现方案
步骤1:修改独立XAML文件的标签标识
在你现有的XAML代码里,给显示版本的<Run>节点添加唯一的x:Name属性,方便后续PowerShell定位修改,不需要调整其他XML结构,完全符合XML独立存放的要求,修改后对应部分代码如下:
<Label Grid.Row="1" Grid.Column="0" x:Name="label2"> <Run FontFamily="Calibri" FontWeight="Bold" FontSize="20" x:Name="versionDisplay" Text="Tool Version Number: " /> </Label>
步骤2:PowerShell加载XAML后动态注入版本号
在原有加载XAML的代码之后,增加版本号读取、XML节点修改的逻辑,同时兼容调试阶段运行.ps1脚本和发布后运行.exe可执行文件两种场景,完整代码如下:
# 原有加载XAML的代码 $aboutXaml = retrieveFile -folderPath "F:\powershellGUI" -fileSelect "about.xml" $global:aboutWindow = New-Object xml $global:aboutWindow.Load($aboutXaml) # 新增:自动获取版本号(兼容脚本/EXE两种运行场景) $currentProcessName = [System.Diagnostics.Process]::GetCurrentProcess().ProcessName # 下方替换为你编译后生成的exe文件名 $isExe = $currentProcessName -eq "tool" if ($isExe) { # 运行exe时从文件属性读取版本 $fileVersion = (Get-Command $MyInvocation.MyCommand.Path).FileVersionInfo.FileVersion } else { # 调试.ps1脚本时从注释头读取版本,复用现有编译脚本的提取逻辑 $authorLines = get-content $MyInvocation.MyCommand.Path | Where-Object {$_ -match 'Author'} if($authorLines.Count -gt 1) { $fileVersion = ($authorLines[0] -split ' ')[-1] } elseif ($authorLines.Count -eq 1){ $fileVersion = ($authorLines -split ' ')[-1] }else{ $fileVersion = "未知版本" } } # 新增:修改XML中的版本显示文本 $nsManager = New-Object System.Xml.XmlNamespaceManager($global:aboutWindow.NameTable) $nsManager.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml") $nsManager.AddNamespace("default", "http://schemas.microsoft.com/winfx/2006/xaml/presentation") # 定位到添加了x:Name的Run节点 $versionNode = $global:aboutWindow.SelectSingleNode("//default:Run[@x:Name='versionDisplay']", $nsManager) # 拼接版本号到原有文本后 $versionNode.SetAttribute("Text", "Tool Version Number: $fileVersion")
步骤3:后续流程无需调整
原有编译打包逻辑完全不需要修改,版本号只会在脚本运行时动态注入到加载的XML对象中,不会修改原始XML文件,也不需要手动维护XML内的版本信息,完全和.ps1头部声明的版本号实时同步。
内容的提问来源于stack exchange,提问作者AngelOfChaos
相关产品推荐
相关产品推荐

