Jenkinsfile Windows cmd输出变量参考

时间:2019-03-24 23:15:00

标签: windows cmd jenkins-pipeline jenkins-groovy

我对groovy很陌生。在我的Jenkinsfile中,我试图将Windows cmd输出存储在变量中,在下一个命令中使用它,但是似乎没有任何效果。这是我得到的最接近的东西:

    pipeline {
    agent any    
    stages {        
        stage('package-windows') {
            when {
                expression { isUnix() == false}
            }
            steps {             
                script {
                FILENAME = bat(label: 'Get file name', returnStdout: true, script:"dir \".\\archive\\%MY_FOLDER%\\www\\main.*.js\" /s /b")              
                }
                bat label: 'replace content', script: "powershell -Command \"(gc \"$FILENAME\") -replace \"https://my-qa.domain.com/api/\", \"https://my-prod.domain.com/api/\" | Out-File \"$FILENAME\"\""
            }
        }
    }
}

当我执行ECHO "$FILENAME"时,这是我得到的输出:

C:\Program Files (x86)\Jenkins\workspace\my-ui>dir ".\archive\55131c0d3c28dc69ce39572eaf2f8585996d9108\main.*.js" /s /b 
C:\Program Files (x86)\Jenkins\workspace\my-ui\archive\55131c0d3c28dc69ce39572eaf2f8585996d9108\www\main.16aedaf4c6be4e47266d.js

我所需要的只是在下一个命令中用来修改内容的文件名main.16aedaf4c6be4e47266d.js。但是在下一个命令中,"$FILENAME"为空。如何将命令输出正确地存储在变量中并在下一个命令中访问?

1 个答案:

答案 0 :(得分:1)

问题是您捕获了命令的完整输出,其中包括2行。第一行是使用dir命令的当前路径,第二行是所需的输出。 首先回显命令,您将看到命令+输出。然后,后续使用将导致看起来空的结果,但实际上是一团糟,因为FILENAME变量包含2行,每行末尾都有新行。

在批处理命令前添加@可以防止将其回显,这就是您想要的。现在,FILENAME变量将只有一行包含您的文件名。 不过,您仍然需要从结果中修剪CRLF,否则它将使您的下一个powershell命令混乱。

我认为以下脚本应该更好地工作。

pipeline {
    agent any
    stages {        
        stage('package-windows') {
            when {
                expression { isUnix() == false}
            }
            steps {             
                script {
                  FILENAME = bat(label: 'Get file name', returnStdout: true, script:"@dir \".\\archive\\%MY_FOLDER%\\www\\main.*.js\" /s /b").trim()
                }
                echo FILENAME
                bat label: 'replace content', script: "powershell -Command (gc \"$FILENAME\") -replace \"https://my-qa.domain.com/api/\", \"https://my-prod.domain.com/api/\""
            }
        }
    }
}