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.BAT
和 CHANGE.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
ROBOCOPY 是 XCOPY 的替代品,自 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 /?
在 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.BAT
和 CHANGE.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
ROBOCOPY 是 XCOPY 的替代品,自 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 /?