You need to enable JavaScript to run this app. PowerShell脚本控制台运行正常,加入Jenkins Pipeline后无法更新AssemblyInfo.cs构建号
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell脚本控制台运行正常,加入Jenkins Pipeline后无法更新AssemblyInfo.cs构建号

问题核心原因及修复方案

以下是你脚本报错的核心原因,均为Jenkins Pipeline与PowerShell交互时的常见易踩坑点:

  • 双重转义冲突:Groovy 字符串和 PowerShell 正则的转义规则叠加,你写的\\.在Groovy解析后会变成\.,传给PowerShell时会被再次转义,最终正则识别出错,正则里的转义符需要写4个反斜杠\\\\,或者用单引号包裹正则内容降低转义复杂度。
  • 替换方法误用:PowerShell 中String.Replace()是纯字面量替换,不支持正则匹配,要实现正则替换必须使用-replace操作符。
  • 未转义PowerShell变量:PowerShell自身的$变量标识符在Groovy的双引号字符串中会被识别为Jenkins Pipeline变量,导致脚本内容解析异常,需要用\$转义PowerShell的自有变量。
  • 路径无引号包裹:如果${files[0].path}的路径包含空格、特殊字符,PowerShell会把路径拆成多个参数触发语法错误,所有路径参数必须用单引号包裹。
  • 返回值带多余空白:powershell步骤开启returnStdout时,默认会在返回结果末尾追加换行符,直接用于替换会导致版本号格式异常,需要加.trim()清除首尾空白。
  • 语法笔误:你写的替换语句末尾多了多余的)) }字符,属于语法错误,运行时会直接抛错。

修复后可直接运行的代码

def getVersion (file) {
    // 用捕获组提取前三位版本号,拼接当前构建号
    def result = powershell(script:"""Get-Content '${file}' | 
    Select-String '([0-9]+\\.[0-9]+\\.[0-9]+)\\.' | 
    foreach-object { \$_.Matches.Groups[1].Value + '.${BUILD_NUMBER}' }""", returnStdout: true)
    // 清除返回值的多余换行、空格
    result = result.trim()
    echo "解析到的新版本号:${result}"
    return result
}
...
def targetFile = files[0].path
def newVersion = getVersion(targetFile)
// 统一用三引号包裹PowerShell脚本,逻辑拆分更清晰,避免语法错误
powershell """
# 一次性读取整个文件内容,性能更高
\$content = Get-Content '${targetFile}' -Raw
# 正则替换所有版本号字符串
\$content = \$content -replace '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+', '${newVersion}'
# 指定编码写入,避免中文注释乱码
Set-Content '${targetFile}' -Value \$content -Encoding UTF8
"""
...

额外优化建议

如果你的AssemblyInfo.cs使用的是UTF-8 BOM或者GB2312编码,对应调整Set-Content的-Encoding参数即可,可选值包括UTF8BOM、Default(系统默认编码)等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 17:24:02