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

ve7v8dk2  于 2023-10-17  发布在  Jenkins
关注(0)|答案(1)|浏览(158)

在Jenkins中,我尝试在BAT文件中实现一些命令。所以我有两个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

此命令将文件夹名称更改为当前系统的日期和时间。
这里是问题,上面给出的 bat 文件运行完全正常,当我在我的CMD上调用它们。但是同样的方法在JENKINS上不起作用,并抛出“命令的语法不正确”。
我无法理解的是,.bat文件在CMD中工作,但在Jenkins中不起作用。
请指引我。

3pvhb19x

3pvhb19x1#

两个批处理文件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 & exit /B

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

首先使用无效的源目录路径执行ROBOCOPY,以通过ROBOCOPY输出错误消息,其中包含区域独立格式的当前日期和时间。区域独立格式意味着日期和时间的格式不依赖于为所使用的帐户配置的国家/地区,该帐户用于Jenkins作为内置本地系统帐户的服务运行。这很可能是命令REN输出错误消息的原因。与使用用户帐户执行批处理文件相比,使用系统帐户设置执行批处理文件时的新文件夹名称不同。
然后再次运行ROBOCOPY,源目录路径正确,目标目录路径在E:\RESULTS中的目录名为yyyy-MM-dd_hhmmss
如果目标目录不存在,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如何处理此输出的完整说明,请参阅Time is set incorrectly after midnight。带WMIC的Windows XP解决方案将在同一答案中详细解释。
要了解所使用的命令及其工作方式,请打开command prompt窗口,在那里执行以下命令,并仔细阅读显示的每个命令的帮助页面。

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

相关问题