Groovy脚本向Bitbucket PR添加Windows共享路径时转义字符异常
问题分析
你的问题核心是转义字符在Groovy、JSON、Shell多环节传递中丢失:
- Groovy字符串里的
\是转义符,需用\\表示实际的反斜杠 - JSON格式要求反斜杠再次转义为
\\ - Shell执行curl时,会对反斜杠进行额外转义
多重转义叠加后,原本的反斜杠被完全消耗,导致路径变形为lr-archieveSfolderbins。
修复方案
1. 修正初始路径的转义
Groovy中要表示一个实际的\,必须用两个\\。调整初始路径赋值:
// 每个实际反斜杠用\\表示,确保Groovy能正确解析 event_msg="\\\\blr-archieve\\Sfolder\\bins\\" event_msg="Shared Path : "+event_msg println event_msg // 输出:Shared Path : \\blr-archieve\Sfolder\bins
2. 用JsonBuilder生成合法JSON(避免手动转义错误)
手动拼接JSON极易出错,推荐用Groovy内置的JsonBuilder自动处理转义:
import groovy.json.JsonBuilder def addCommentToPR(String... event_msg){ // 拼接消息并保留换行 def event_msg_tmp = event_msg.join("\\n") // 用JsonBuilder生成符合规范的JSON def jsonBuilder = new JsonBuilder() jsonBuilder { text event_msg_tmp } def jsonStr = jsonBuilder.toString() def Comment_Url= "https://bitbucket.testing.com/rest/api/latest/projects/test/repos/myrepo/pull-requests/123/comments?diffType=EFFECTIVE&markup=true&avatarSize=48" withCredentials([usernameColonPassword(credentialsId: 'TESTING', variable: 'API_PWD')]) { // 用单引号包裹JSON字符串,避免Shell解析干扰 println sh(script: '''curl -u $API_PWD -d ''' + "'${jsonStr}'" + ''' -X POST -i ''' + Comment_Url + ''' -H "Content-Type:application/json"''', returnStdout: true) } }
自动转义建议
- 处理路径类字符串时,可借助Apache Commons Lang的
StringEscapeUtils自动完成JSON转义:import org.apache.commons.lang.StringEscapeUtils def escapedMsg = StringEscapeUtils.escapeJavaScript(event_msg_tmp) // 该方法兼容JSON转义规则 - 永远优先用JSON库生成JSON内容,而非手动拼接,从根源避免转义错误。
内容的提问来源于stack exchange,提问作者R_SS
相关产品推荐
相关产品推荐

