如何在多行批处理脚本中访问 jenkins groovy 变量

How to access jenkins groovy variable in a multiline batch script

我有一个简单的詹金斯管道,如下所示:-

node ('windows') {

def myvar = bat(returnStdout: true, script: '''FOR /F "tokens=2 delims==" %%a IN ('C:\Windows\System32\find.exe "test2" ^<%WORKSPACE%\test.txt') DO SET test2value=%%a
echo %test2value%''').trim()
echo myvar

 bat '''
        SET var='+myvar+'
        echo %var%
     '''
     
 }

我在这里试图实现的是在多行批处理脚本中访问 groovy 变量 myvar,但它不起作用。同样的事情在多行三重单引号 shell 脚本中工作,如下所示。这只是一个示例,groovy 变量 myvar 正在使用一些 shell 脚本

分配一些其他值

sh '''
     var=''' + myvar + '''
     echo $var
  '''

如何在这个三重单引号多行批处理脚本中访问这个 groovy 变量 myvar?

解决方案

There are a lot of small nuanced changes in my answer as compared to yours. Please first copy and paste it into your pipeline to verify it works for you. You can then make modifications as needed.

你有两个问题。首先,批处理脚本在执行时将您正在执行的命令打印到标准输出。 Bash 不这样做。在您的示例中,存储在 stdout 中的值不仅是您回显的值,而且是整个命令。为了解决这个问题,我在第一个批处理脚本的两个位置添加了 @ 符号。这是您的主要问题。

您的次要问题是您错误地引用了 Groovy 变量。不管是单行还是多行都不行。

我做了一些其他修改以删除我认为不必要的代码。我删除了 %workspace% 变量,因为它是不必要的。我还从您的第一个批处理脚本中删除了 SET 命令,因为它也没有必要。我还删除了 find.exe 的绝对路径,因为它应该在您的 PATH 变量中

node('windows') {
    def myvar = bat(returnStdout:true, script:'''@ FOR /F "tokens=2 delims==" %%a IN ('find "test2" test.txt') DO @ echo %%a''').trim()
    echo myvar + ' is set'
    
    bat "echo ${myvar} is the value"
    
    bat """
        SET var=$myvar
        echo %var%
    """
}

The above example was tested in 2.x and 1.x. It works in Jenkins 2.x but will not work in some versions of Jenkins 1.x.

构建日志

[Pipeline] {
[Pipeline] bat
[miles-objects] Running batch script
[Pipeline] echo
xyz is set
[Pipeline] bat
[miles-objects] Running batch script

c:\jenkins\workspace\miles-objects>echo xyz is the value 
xyz is the value
[Pipeline] bat
[miles-objects] Running batch script

c:\jenkins\workspace\miles-objects>SET var=xyz 

c:\jenkins\workspace\miles-objects>echo xyz 
xyz
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS