batch-file - Jenkins 作业因命令中的 for 循环而失败
问题描述
在 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 中同样无效。
请指导我。
解决方案
这两个批处理文件可以用一个命令行替换为一个批处理文件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 & goto :EOF
ROBOCOPY是XCOPY的替代品,自 Windows Vista 和 Windows Server 2003 起默认可用。
首先使用无效的源目录路径执行ROBOCOPY ,以通过ROBOCOPY输出错误消息,其中包含区域独立格式的当前日期和时间。区域无关格式意味着日期和时间的格式不依赖于为使用的帐户配置的国家/地区,该帐户用于 Jenkins 作为服务运行的内置本地系统帐户。这很可能是命令REN输出错误消息的原因。与使用用户帐户执行批处理文件相比,使用系统帐户设置执行批处理文件时的新文件夹名称不同。
然后使用正确的源目录路径和目标目录路径再次运行ROBOCOPYyyyy-MM-dd_hhmmss
,其中的目录名称为E:\RESULTS
.
如果目标目录不存在,ROBOCOPY会像XCOPY一样自动创建整个目录树到目标目录。
该命令goto :EOF
需要在复制文件后结束批处理文件执行,因为ROBOCOPY在错误时输出第二行,否则FOR也将处理该行。: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 wrong after午夜。使用WMIC的 Windows XP 解决方案在同一答案中进行了详细说明。
要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
goto /?
if /?
robocopy /?
set /?
setlocal /?
wmic /?
wmic os /?
wmic os get /?
wmic os get localdatetime /?
xcopy /?
推荐阅读
- java - Java,比较 ArrayList 的值
- django - 登录页面出错 - TypeError: __init__() got an unexpected keyword argument 'request'
- jquery - Vue中如何重复移动一个元素?
- reactjs - 列出文件以使用列表生成动态组件
- sf - 使用 WifiManager 和 Arduinojson 6 保存自定义参数
- graphql - 用于从 GraphQL 端点定期镜像完整数据集的工具?
- sql - 在 Neteeza 中使用 LIKE 运算符加入
- postscript - 在 postscript 中,如何从当前活动的字体中获取 UnderlinePosition,它是一个整数?
- javascript - 将views.py中的值显示为html
- python-3.x - Python3 PyTest Flask JWT 抛出 HTTP 422 Unprocessable Entity