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

问题描述 投票:0回答:1

在 Jenkins 中,我尝试在 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 中不起作用。

请指导我。

batch-file jenkins batch-processing jenkins-cli
1个回答
1
投票

只需一个命令行即可将两个批处理文件

RUN.BAT
CHANGE.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 & exit /B

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

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

然后使用正确的源目录路径和目标目录路径再次运行ROBOCOPY,目标目录路径以

yyyy-MM-dd_hhmmss
作为
E:\RESULTS
中的目录名称。

如果目标目录尚不存在,

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

复制文件后需要命令

exit /B
来结束批处理文件执行,因为 ROBOCOPY 会在错误时输出第二行,否则也会由 FOR 处理。可以将
exit /B
替换为
goto Label
,如果还有更多行要执行,则下一行是
:Label
,例如:

@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 如何处理此输出,请参阅午夜后时间设置不正确。使用 WMIC 的 Windows XP 解决方案在同一个答案中进行了详细解释。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • echo /?
  • endlocal /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • robocopy /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?
  • xcopy /?
© www.soinside.com 2019 - 2024. All rights reserved.