Jenkinsfile windows cmd 输出变量参考
Jenkinsfile windows cmd output variable reference
我对 groovy.In 很陌生,我的 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 ".\archive131c0d3c28dc69ce39572eaf2f8585996d9108\main.*.js" /s /b
C:\Program Files (x86)\Jenkins\workspace\my-ui\archive131c0d3c28dc69ce39572eaf2f8585996d9108\www\main.16aedaf4c6be4e47266d.js
我只需要文件名main.16aedaf4c6be4e47266d.js
,以便在下一个命令中修改内容。但是在下一个命令中 "$FILENAME"
是空的。如何将命令输出正确存储在变量中并在下一个命令中访问?
问题是您捕获了命令的完整输出,其中包括 2 行。第一行是 dir 命令的当前路径,第二行是所需的输出。
第一次回显命令时,您会看到命令 + 输出。然后后续使用将导致结果看起来是空的,但实际上是一个混乱的行,因为 FILENAME 变量包含 2 行,每行末尾都有一个新行。
在批处理命令前添加@ 将防止它被回显,这就是您想要的。现在 FILENAME 变量将只有一行包含您的文件名。
不过,您仍需要 trim 结果中的 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/\""
}
}
}
}
我对 groovy.In 很陌生,我的 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 ".\archive131c0d3c28dc69ce39572eaf2f8585996d9108\main.*.js" /s /b
C:\Program Files (x86)\Jenkins\workspace\my-ui\archive131c0d3c28dc69ce39572eaf2f8585996d9108\www\main.16aedaf4c6be4e47266d.js
我只需要文件名main.16aedaf4c6be4e47266d.js
,以便在下一个命令中修改内容。但是在下一个命令中 "$FILENAME"
是空的。如何将命令输出正确存储在变量中并在下一个命令中访问?
问题是您捕获了命令的完整输出,其中包括 2 行。第一行是 dir 命令的当前路径,第二行是所需的输出。 第一次回显命令时,您会看到命令 + 输出。然后后续使用将导致结果看起来是空的,但实际上是一个混乱的行,因为 FILENAME 变量包含 2 行,每行末尾都有一个新行。
在批处理命令前添加@ 将防止它被回显,这就是您想要的。现在 FILENAME 变量将只有一行包含您的文件名。 不过,您仍需要 trim 结果中的 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/\""
}
}
}
}