如何通过命令行自动将变量的值传递给批处理或外壳脚本文件(在Jenkins中使用)

qoefvg9y  于 2022-10-06  发布在  Jenkins
关注(0)|答案(2)|浏览(163)

我得到了一个要求用户输入的批处理文件。批处理脚本prod_release.bat如下所示:

set /p CH1=Select the build option: 
if '%CH1%'=='1' goto SELECT_APP_L
if '%CH1%'=='2' goto SELECT_APP_M
if '%CH1%'=='3' goto SELECT_APP_H

if '%CH1%'!='1' && '%CH1%'!='2' && '%CH1%'!='3' goto START

我需要从命令行给出CH1值,这样脚本就会自动获取它。

我试着当

set CH1=2 && prod_release.bat

但是,它仍然要求用户输入并等待,直到它被给出。

你能帮我这个忙吗?

他们无法更改此文件,因为他们正在将此文件用于其他目的。

我只能在我的应用程序中使用它,但不能编辑它。我也需要类似的PowerShell和外壳脚本的帮助。

我想通过Jenkins(或)添加到另一个BAT或PYTHON应用程序来运行这个BAT脚本,以便在不要求用户交互的情况下使用我想要的输入运行。
我无法更改批处理文件。可以这样想,我只能从另一个批处理文件中调用它。例如,我必须将Jenkins BAT中的这个批处理文件命名为“prod_relase.bat”,然后它就必须在不等待选择的情况下运行。

lyr7nygr

lyr7nygr1#

不设置CH1=选择构建选项:您可以设置CH1=%1并在执行文件时传递该值,如下所示

set /p CH1=%1
if '%CH1%'=='1' goto SELECT_APP_L
if '%CH1%'=='2' goto SELECT_APP_M
if '%CH1%'=='3' goto SELECT_APP_H

Prod_Release ase.BAT 2

现在,当文件执行时,值2将被赋给CH1变量。同样,当文件执行示例时,您可以传递CH1所需的任何值

Prod_Release ase.BAT 1

yduiuuwa

yduiuuwa2#

选择提示符应该使用命令CHOICE,而不是set /P

:SelectBuildOption
%SystemRoot%System32choice.exe /C 123 /N /M "Select the build option:"
if errorlevel 3 goto SELECT_APP_H
if errorlevel 2 goto SELECT_APP_M
if errorlevel 1 goto SELECT_APP_L
goto SelectBuildOption

请阅读我在How to stop Windows command interpreter from quitting batch file execution on an incorrect user input?上的答案,它详细解释了set /P的用法和CHOICE的用法,并解释了两种解决方案在提示用户输入东西方面的优缺点。

如果批处理文件由Jenkins执行,且参数类似于1用于SELECT_APP_L定义的构建或2用于SELECT_APP_M定义的构建或SELECT_APP_H用于SELECT_APP_H定义的构建,则可以在批处理文件prod_release.bat中的标签SelectBuildOption上使用以下代码。

if "%~1" == "1" goto SELECT_APP_L
if "%~1" == "2" goto SELECT_APP_M
if "%~1" == "3" goto SELECT_APP_H

当然,对于可选的构建选项,也可以使用123之外的其他更有意义的字符串,例如:

if /I "%~1" == "APP_L" goto SELECT_APP_L
if /I "%~1" == "APP_M" goto SELECT_APP_M
if /I "%~1" == "APP_H" goto SELECT_APP_H

使用该代码,Jenkins可以使用APP_LAPP_MAPP_H(不区分大小写)调用批处理文件,而不使用或不包含在"中。

如果由于批处理文件在没有任何参数的情况下被调用,或者第一个参数不等于三个比较的字符串中的一个,则cmd.exe执行三个if条件下的代码,即标签SelectBuildOption下的代码。

command prompt中运行call /?,输出命令call的用法帮助,解释如何引用批处理文件参数。

我建议也阅读我在Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files上的答案。它详细解释了Windows命令处理器cmd.exe的内部命令if如何完成字符串比较。

如果Jenkins作业定义了要使用的构建选项的环境变量,则只需在三个if命令行上将%~1替换为%VariableName%,批处理文件也可以使用环境变量定义的构建选项供Jenkins使用,同时批处理文件仍可用于手动执行。

批处理文件支持可选父进程在批处理文件外部定义的环境变量BuildOption的示例:

if not defined BuildOption goto SelectBuildOption
if /I "%BuildOption%" == "APP_L" goto SELECT_APP_L
if /I "%BuildOption%" == "APP_M" goto SELECT_APP_M
if /I "%BuildOption%" == "APP_H" goto SELECT_APP_H

通常的做法是,用于构建过程的脚本支持可选的用于控制构建过程的一个或多个参数或用于自动构建的一个或多个环境变量,同时提示脚本的用户在不使用可选参数或不使用可选环境变量的情况下使用脚本来控制构建过程。

因此,我强烈建议联系批处理文件的作者,并要求按照上面的建议增强批处理文件prod_release.bat,以便在全自动构建过程中轻松使用。手动使用的执行行为不会随着这些修改而改变,这些修改对于Jenkins的全自动构建非常重要。

另一种可能性是输出提示的答案,并将此输出从cmd.exestdout重定向到批处理文件的stdin

示例:

(echo 1)|prod_release.bat

此命令行允许cmd.exe将字节为0x31 0x0D 0x0A的字符串(1作为ASCII字符+回车符+换行符)重定向到批处理文件的标准输入流,批处理文件中的firstset /Pchoice从输入流中读取,从而自动回答first提示符(希望是)可接受的选项。

但对于构建过程中使用的脚本来说,这种方法非常少见。对被调用的脚本文件进行很小的修改,如运行可执行文件或首先从输入流读取命令,可能会导致此解决方案导致脚本错误执行,从而再次导致无法工作的自动构建过程。因此,与增强脚本以支持可选参数或可选环境变量以由父进程定义必要的构建选项相比,这种变通解决方案非常糟糕,而不是总是提示用户提供必要的构建选项。

用于构建过程的编码良好的脚本支持在脚本外部定义的可选参数或可选环境变量,以控制构建过程的选项,并且如果在没有参数或没有父进程定义的环境变量的情况下(即,当用户执行脚本时)执行脚本,则提示输入这些选项。

相关问题