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

Azure Pipeline中PowerShell修改.csproj版本节点报错的解决方法

修复Azure DevOps流水线中更新.csproj版本的PowerShell任务错误

错误原因

你碰到的问题是PowerShell脚本误操作了XML文档的根节点(Document节点)的InnerText属性,而这个属性是只读的。正确做法是精准定位到<Version>节点(或创建该节点)来修改版本值。

正确的PowerShell脚本实现

下面是可直接用于Azure DevOps流水线的脚本,支持修改已有Version节点,或在PropertyGroup下新增Version节点:

# 定义目标版本号,可替换为流水线变量,比如$(Build.BuildNumber)
$newVersion = "1.0.$(Build.BuildId)"

# 递归遍历所有.csproj文件
Get-ChildItem -Path "$(System.DefaultWorkingDirectory)" -Filter *.csproj -Recurse | ForEach-Object {
    $xml = [xml](Get-Content $_.FullName)
    
    # 优先选择无Condition的PropertyGroup(通常是默认属性组),没有的话取第一个PropertyGroup
    $propertyGroup = $xml.Project.PropertyGroup | Where-Object { -not $_.Condition } | Select-Object -First 1
    if (-not $propertyGroup) {
        $propertyGroup = $xml.Project.PropertyGroup | Select-Object -First 1
    }

    # 查找Version节点
    $versionNode = $propertyGroup.SelectSingleNode("Version")

    if ($versionNode) {
        # 已存在Version节点,直接更新值
        $versionNode.InnerText = $newVersion
        Write-Host "更新文件 $($_.FullName) 的版本为: $newVersion"
    } else {
        # 不存在Version节点,创建新节点并添加到PropertyGroup
        $newVersionNode = $xml.CreateElement("Version")
        $newVersionNode.InnerText = $newVersion
        $propertyGroup.AppendChild($newVersionNode) | Out-Null
        Write-Host "在文件 $($_.FullName) 中新增版本节点: $newVersion"
    }

    # 保存修改后的XML文件,保留原编码避免乱码
    $xml.Save($_.FullName)
}

流水线任务配置要点

  • 在流水线中添加PowerShell任务,选择“内联脚本”,粘贴上述代码
  • 版本号可替换为流水线内置变量(如$(Build.BuildNumber),需提前在流水线选项中配置版本格式)或自定义变量
  • 任务工作目录默认使用$(System.DefaultWorkingDirectory)即可,对应代码仓库根目录

关键注意事项

  • 绝对不要直接操作$xml(Document节点)的InnerText,必须定位到具体的元素节点
  • 保存XML时会自动沿用原文件编码,避免编码问题导致文件损坏
  • 脚本优先选择无Condition的PropertyGroup,确保修改的是项目的默认版本属性

内容的提问来源于stack exchange,提问作者Enrico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:27:06