You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:27:05