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
相关产品推荐
相关产品推荐

