PowerShell添加csproj的Version节点时输出属性列表的原因及解决方法
问题原因分析
1. 多余属性输出的原因
AppendChild方法执行后会返回新创建的XML节点对象,PowerShell默认会将所有未被捕获、未被丢弃的返回值输出到控制台,你看到的长串属性列表就是这个返回节点的格式化输出。
2. 明明存在Version节点仍然进入添加逻辑的原因
你的判断条件存在逻辑错误:$csprojcontents.Project.PropertyGroup.name -notmatch "Version"是在判断PropertyGroup节点自身的name属性值是否包含Version,而非判断PropertyGroup下是否存在名为Version的子节点,所以判断逻辑完全失效,每次执行都会重复添加Version节点,导致多次输出节点属性。
修复方案
修改两处代码即可:
- 给
AppendChild方法的返回值添加丢弃逻辑,避免输出 - 修正Version节点是否存在的判断逻辑
修复后的完整代码如下:
# My Wpf App Write-Host "WpfApp Versioning started" $sourceDir = "C:\Users\me\source\repos\mysolution" $csprojfilename = Join-Path $sourceDir "myapp\myapp.csproj" "Project file to update " + $csprojfilename [xml]$csprojcontents = Get-Content -Path $csprojfilename; # 先查找已有的Version节点 $existingVersionNode = $csprojcontents.SelectSingleNode("/Project/PropertyGroup/Version") "Current version number is " + $existingVersionNode.InnerText + "." $oldversionNumber = $existingVersionNode.InnerText if ($null -eq $existingVersionNode) { Write-Host "Version is null." # 用[void]丢弃AppendChild的返回值,避免输出 [void]$csprojcontents.Project.PropertyGroup.AppendChild($csprojcontents.ImportNode(([xml]"<Version/>").DocumentElement,$true)) } Write-Host "Update Version." $csprojcontents.SelectSingleNode("/Project/PropertyGroup/Version").InnerText = $ecatBuildNumber.ToString() Write-Host "Save csproj." $csprojcontents.Save($csprojfilename) "Version number has been updated from " + $oldversionNumber + " to " + $ecatBuildNumber + "." Write-Host "WpfApp Versioning Finished"
额外说明
- 用
Join-Path拼接路径比直接字符串拼接更稳定,避免出现多斜杠、少斜杠的问题 - 直接用
SelectSingleNode查找节点比索引访问更可靠,不需要处理多节点的索引问题 - 如果你项目的csproj有多个PropertyGroup节点,调整XPath定位到你实际需要修改的PropertyGroup节点即可
内容的提问来源于stack exchange,提问作者On The Net Again
相关产品推荐
相关产品推荐

