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

Jenkins job is failing with for loop in command

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

CD\
E:
CD E:\RESULTS
mkdir 1
xcopy E:\I1[=10=] E:\RESULTS

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

现在让我们来看看 CHANGE.BAT 这里的命令是:

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

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

问题出在这里,当我在我的 CMD 上调用上面给出的 bat 文件时,它们运行得很好。但同样在 JENKINS 上不起作用并抛出“命令的语法不正确”。

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

请指导我。

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

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

ROBOCOPYXCOPY 的替代品,自 Windows Vista 和 Windows Server 起默认可用2003.

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

然后 ROBOCOPY 是 运行 再次使用正确的源目录路径和目标目录路径 yyyy-MM-dd_hhmmss 作为 E:\RESULTS 中的目录名称.

如果目标目录不存在,

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

命令 goto :EOF 需要在复制文件后结束批处理文件执行,因为 ROBOCOPY 输出错误的第二行,否则也将由为了。如果要执行更多行,则可以用写在下一行的任何其他标签替换预定义标签 :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[=11=]" "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[=12=]" "E:\RESULTS\%CurrentDateTime%\" /I /R /Q /Y >nul
endlocal

完整解释 ROBOCOPY 在 运行 上首先使用无效的源目录路径输出什么以及如何 FOR 处理这个输出见 Time is set incorrectly after midnight。使用 WMIC 的 Windows XP 解决方案在同一个答案中有详细说明。

为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

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