Jenkins管道中的PowerShell环境变量给出了“org.jenkinsci.plugins.workflow.cps”。EnvActionImpl@1b69f5bb:变量名称`

Jenkins管道中的PowerShell环境变量给出了“org.jenkinsci.plugins.workflow.cps”。EnvActionImpl@1b69f5bb:变量名称`,powershell,jenkins,command-line,jenkins-pipeline,Powershell,Jenkins,Command Line,Jenkins Pipeline,是否有人在Jenkins管道中使用PowerShell时遇到问题,当您尝试引入环境变量(例如,$env:CHANGE\u ID)时,它的计算结果如下 org.jenkinsci.plugins.workflow.cps.EnvActionImpl@1b69f5bb:VARIABLE_NAME 在这个问题上,似乎其他人遇到了相同的问题,但我不确定问题是否得到了回答(它们显示了如何打印所有环境变量,但没有显示在未实现toString时如何获取特定的环境变量): 我的Jenkins管道文件: pi

是否有人在Jenkins管道中使用PowerShell时遇到问题,当您尝试引入环境变量(例如,
$env:CHANGE\u ID
)时,它的计算结果如下

org.jenkinsci.plugins.workflow.cps.EnvActionImpl@1b69f5bb:VARIABLE_NAME
在这个问题上,似乎其他人遇到了相同的问题,但我不确定问题是否得到了回答(它们显示了如何打印所有环境变量,但没有显示在未实现
toString
时如何获取特定的环境变量):

我的Jenkins管道文件:

pipeline {
  agent {
    node {
      label 'jenkins_managed_windows'
    }
  }

  stages {
    stage('SonarQube Analysis') {
      steps {
        powershell "dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$env:BRANCH_NAME"
      }
    }

    stage('Build') {
      steps {
        powershell 'dotnet build'
      }
    }

    stage('SonarQube End') {
      steps {
        powershell 'dotnet sonarscanner end'
      }
    }
  }
}
带有环境变量的步骤以以下方式运行:

dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=org.jenkinsci.plugins.workflow.cps.EnvActionImpl@54ee3a8:BRANCH_NAME
有趣的是,如果我使用单引号:
powershell 'dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$env:BRANCH_NAME'
它甚至根本不计算环境变量,只是以如下方式运行:
dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$env:BRANCH_NAME

结果表明,以这种方式指定环境变量是可行的:

powershell "dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=${env:BRANCH_NAME}"

您还可以使用句点而不是冒号(
${env.BRANCH\u NAME}
)。

语法形式
$env:BRANCH\u NAME
和等效的
${env:BRANCH\u NAME}
是PowerShell结构,这意味着为了在插入的Groovy字符串(
“…”
)中将它们传递给PowerShell,您必须
\
-转义
$
字符,以防止Groovy预先解释构造:

powershell "dotnet sonarscanner begin ... /d:sonar.branch.name=\$env:BRANCH_NAME"
也就是说,如果您的命令不包含需要插值的Groovy变量(让PowerShell引用环境变量更安全、更健壮),您只需使用一个文本Groovy字符串,
“…”
,其中
$
字符。目的地为PowerShell,无需逃逸

powershell 'dotnet sonarscanner begin ... /d:sonar.branch.name=$env:BRANCH_NAME'

至于你所尝试的

powershell 'dotnet sonarscanner begin ... /d:sonar.branch.name=$env:BRANCH_NAME'
插入Groovy字符串中的“…$env:BRANCH_NAME”会导致Groovy插入变量
env
(因为它前面有
$
),并将
:BRANCH_NAME
视为一个文本

由于
env
指的是包含所有环境变量的对象,因此您看到的是该对象的(无用的)字符串化,即类名(
org.jenkinsci.plugins.workflow.cps.EnvActionImpl
),后跟一个实例特定的哈希代码(
@54ee3a8

使用
${env.BRANCH\u NAME}
可能会起作用,因为环境变量
BRANCH\u NAME
的值可以作为
env
对象的属性访问,但请注意,这意味着Groovy会预先插入值,而PowerShell只会看到结果值


在简单情况下(没有空格或特殊字符的环境变量值),
“${env.BRANCH\u NAME}”和
“\${env.BRANCH\u NAME}”是可互换的,但是,只有后一种方法对所有值都有效。

不计算单引号字符串。请尝试
powershell“dotnet Sonascanner begin/k:project key/d:sonar.branch.name=$($env:branch\u name)”
这给了我:
工作流脚本:11:美元符号后的非法字符串正文字符;解决方案:要么转义一个字面的美元符号“\$5”,要么将值表达式“${5}”括在第11行第3列。
I然后尝试:
powershell“dotnet sonascanner begin/k:project key/d:sonar.branch.name=${env:branch\u name}”
,最终成功。谢谢在
“…”
内部,您应该
\
-转义
$
-
\${env:BRANCH\u NAME}
-这会阻止Groovy潜在地解释构造。相反,使用
${env.BRANCH\u NAME}
(注意
)会导致Groovy在PowerShell看到结果字符串之前,用环境变量
BRANCH\u NAME
的值替换该构造。在简单的情况下,这两种方法是可以互换的,但如果变量值包含空格或特殊字符,则后一种方法可能会中断命令。Jenkins管道的输出只是将命令显示为
dotnet sonarscanner begin/k:project key/d:sonar.branch.name=$env:branch\u name
,因为Groovy没有插入命令。当它在PowerShell中实际运行时,尽管它使用的是实际的环境变量。