如何将Jenkins流水线中的TAG与工作区变量传入PowerShell脚本?
问题:Jenkins多分支流水线变量无法传入PowerShell脚本
我有一段多分支流水线脚本,用于获取当前流水线刚检出的Git标签和工作区路径。通过echo "TAG: ${TAG}"和echo "Workspace Path: ${workspacePath}"能看到正确的结果,但这两个变量无法传入我的PowerShell脚本中。
原流水线代码:
pipeline { agent any stages { stage('Build') { steps { script { // 执行git命令获取最新标签 def cmd = new StringBuilder() cmd.append("git describe --tags") // 格式化命令返回结果为标签 def TAG = bat( returnStdout: true, script: "${cmd.toString()}" ) echo "TAG: ${TAG}" // 打印当前工作区路径 def workspacePath = pwd() echo "Workspace Path: ${workspacePath}" withEnv(["RELEASE_TAG_NAME=$TAG", "WORKSPACE_PATH=$workspacePath"]){ powershell''' & "C:\Users\Administrator\Desktop\controlled_build_script.ps1" -RELEASE_TAG_NAME ${env:RELEASE_TAG_NAME} -WORKSPACE_PATH ${env:WORKSPACE_PATH} ''' } } } } } }
问题原因及解决方法
1. Git标签结果包含多余换行符
bat命令返回的标准输出会自带命令执行后的换行符,直接赋值给TAG会导致环境变量携带无效换行,传递给PowerShell时出现参数异常。需要用trim()方法去除多余的空白字符。
2. PowerShell脚本块中的转义错误
原代码里的&是HTML转义字符,实际在PowerShell中应该用&来调用外部脚本,否则会触发语法错误。
修正后的完整代码
pipeline { agent any stages { stage('Build') { steps { script { // 执行git命令获取最新标签 def cmd = "git describe --tags" // 格式化命令返回结果,去除多余空白字符 def TAG = bat( returnStdout: true, script: cmd ).trim() echo "TAG: ${TAG}" // 打印当前工作区路径 def workspacePath = pwd() echo "Workspace Path: ${workspacePath}" withEnv(["RELEASE_TAG_NAME=$TAG", "WORKSPACE_PATH=$workspacePath"]){ powershell''' & "C:\Users\Administrator\Desktop\controlled_build_script.ps1" -RELEASE_TAG_NAME $env:RELEASE_TAG_NAME -WORKSPACE_PATH $env:WORKSPACE_PATH ''' } } } } } }
额外说明
如果不想用withEnv,也可以直接在PowerShell脚本块中通过Groovy插值传递变量(注意用双引号包裹脚本块,同时转义PowerShell中的特殊字符):
powershell """ & "C:\\Users\\Administrator\\Desktop\\controlled_build_script.ps1" -RELEASE_TAG_NAME "$TAG" -WORKSPACE_PATH "$workspacePath" """
这种方式更直接,但需要注意路径中的反斜杠要转义,且变量中的特殊字符可能需要额外处理。
内容的提问来源于stack exchange,提问作者Mootje
相关产品推荐
相关产品推荐

