Jenkins作业因命令中的for循环而失败

时间:2020-06-30 15:11:53

标签: batch-file jenkins batch-processing jenkins-cli

在詹金斯,我尝试在BAT文件中实现的命令很少。所以我有2个BAT文件(RUN.BAT和CHANGE.BAT)。在RUN.BAT中,命令如下:

CD\
E:
CD E:\RESULTS\1
mkdir 1
xcopy E:\I1\0 E:\RESULTS\1

在给定命令上方,将转到特定文件夹并创建一个名为“ 1”的文件夹,然后XCOPY行会将内容从文件夹“ O”复制到文件夹“ 1”。

现在让我们进入CHANGE.BAT,命令如下:

for /f "tokens=1-7 delims=-:. " %%a in ("%date% %time%") do ren E:\RESULTS\1 %%a%%b%%c_%%d%%e%%f%%g

此命令会将文件夹名称更改为当前系统的日期和时间。

这里是问题,当我在CMD上调用上述bat文件时,它们运行完全正常。但是在JENKINS上却不起作用,并抛出“命令的语法不正确”。

我无法理解的是,.bat文件在CMD中有效,但在Jenkins中则无效。

请引导我。

1 个答案:

答案 0 :(得分:1)

两个批处理文件RUN.BATCHANGE.BAT可以用一个命令行替换为单个批处理文件:

@for /F "tokens=1-6 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do @%SystemRoot%\System32\robocopy.exe "E:\I1\0" "E:\RESULTS\%%I-%%J-%%K_%%L%%M%%N" /E /R:3 /W:2 /NDL /NFL /NJH /NJS & goto :EOF

ROBOCOPY XCOPY 的替代,并且自Windows Vista和Windows Server 2003起默认可用。

首先使用无效的源目录路径执行 ROBOCOPY ,以通过 ROBOCOPY 输出错误消息,其中包含与区域无关的格式的当前日期和时间。与区域无关的格式意味着日期和时间的格式不取决于为使用的帐户配置哪个国家/地区,该国家/地区是针对作为内置服务的Jenkins运行的内置本地系统帐户。这很可能是命令 REN 输出错误消息的原因。与使用用户帐户执行批处理文件相比,使用系统帐户设置执行批处理文件时,新文件夹名称有所不同。

然后再次运行 ROBOCOPY ,并在yyyy-MM-dd_hhmmss中使用正确的源目录路径和目标目录路径(以E:\RESULTS作为目录名)。

如果目标目录还不存在,

ROBOCOPY 会像 XCOPY 一样自动创建到目标目录的整个目录树。

由于 ROBOCOPY 输出第二行出错,因此命令goto :EOF必须在复制文件后结束批处理文件的执行,否则将由 FOR < / strong>。如果还有更多行要执行,则可以用写在下一行的任何其他标签替换预定义标签:EOF

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=1-6 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do %SystemRoot%\System32\robocopy.exe "E:\I1\0" "E:\RESULTS\%%I-%%J-%%K_%%L%%M%%N" /E /R:3 /W:2 /NDL /NFL /NJH /NJS & goto FilesCopied
:FilesCopied
rem More command lines to execute.
endlocal

为了完整起见,一种解决方案也可以在Windows XP和所有更高的Windows版本上使用:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "CurrentDateTime=%%I"
set "CurrentDateTime=%CurrentDateTime:~0,4%-%CurrentDateTime:~4,2%-%CurrentDateTime:~6,2%_%CurrentDateTime:~8,6%"
%SystemRoot%\System32\xcopy.exe "E:\I1\0" "E:\RESULTS\%CurrentDateTime%\" /I /R /Q /Y >nul
endlocal

有关 ROBOCOPY 在第一次使用无效的源目录路径运行时输出的内容以及 FOR 如何处理此输出的详细信息,请参见Time is set incorrectly after midnight。在同一答案中详细说明了使用 WMIC 的Windows XP解决方案。

要了解所使用的命令及其工作方式,请打开command prompt窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • robocopy /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?
  • xcopy /?