通过 jenkins 执行批处理命令不提取文件,尽管它在 运行 时提取为 bat 文件

batch command execution through jenkins not extracting files though it extracts when run as bat file

我在 Jenkins 中编写了以下批处理脚本。当我 运行 它作为同一文件夹中 Jenkins 服务器工作区中的 bat 文件时,它 运行 没有任何问题。但是当我 运行 它通过詹金斯使用 "Execute Windows Batch Command" 它没有提取。它打印带有相关路径的 "about to copy from" 行,并从那里继续执行。控制台输出中没有打印任何内容,也没有提取任何内容。 下面是脚本。

echo %CD%
FOR /D %%p IN ("%CD%\Setups\*") DO rmdir "%%p" /s /q

 call mvn org.apache.maven.plugins:maven-dependency-plugin:2.4:get -DrepoUrl=http://10.101.2.23:8081/nexus/content/repositories/releases/ -Dartifact=test:update-service:1.0.3 -Ddest=Setups/Services/update-service.jar
call mvn org.apache.maven.plugins:maven-dependency-plugin:2.4:get -DrepoUrl=http://10.101.2.23:8081/nexus/content/repositories/releases/ -Dartifact=test:installer-prerequisites:1.0.0 -Ddest=Setups/PreRequisites/installer-prerequisites.zip -Dpackaging=zip

echo came after the downloads

for /r %%i in (*.zip) do (
  echo about to copy from %%~dpi to %%~fi
Call :UnZipFile "%%~dpi" "%%~fi"
echo called unzip on %%i
del /S /Q "%%~fi"
)

exit /b

:UnZipFile <ExtractTo> <newzipfile>
    setlocal
    set vbs="%temp%\_.vbs"
    if exist "%vbs%" del /f /q "%vbs%"
     >"%vbs%" echo Set fso = CreateObject("Scripting.FileSystemObject")
    >>"%vbs%" echo If NOT fso.FolderExists("%~1") Then
    >>"%vbs%" echo fso.CreateFolder("%~1")
    >>"%vbs%" echo End If
    >>"%vbs%" echo set objShell = CreateObject("Shell.Application")
    >>"%vbs%" echo set FilesInZip=objShell.NameSpace("%~2").items
    >>"%vbs%" echo objShell.NameSpace("%~1").CopyHere(FilesInZip)
    >>"%vbs%" echo Set fso = Nothing
    >>"%vbs%" echo Set objShell = Nothing
    cscript //nologo "%vbs%"
    if exist "%vbs%" del /f /q "%vbs%"
    endlocal

这在 运行 作为 bat 文件时工作正常。请指教

下面是 jenkins 工作区路径:

C:\Program Files (x86)\Jenkins\jobs\Installer\workspace\Setups

检查您的 zip 文件的权限并确保它可以被运行 jenkins 的用户读取。

我不得不在子例程的末尾指定 GOTO:eof。也就是说,

:UnZipFile <ExtractTo> <newzipfile>
setlocal
set vbs="%temp%\_.vbs"
if exist "%vbs%" del /f /q "%vbs%"
 >"%vbs%" echo Set fso = CreateObject("Scripting.FileSystemObject")
>>"%vbs%" echo If NOT fso.FolderExists("%~1") Then
>>"%vbs%" echo fso.CreateFolder("%~1")
>>"%vbs%" echo End If
>>"%vbs%" echo set objShell = CreateObject("Shell.Application")
>>"%vbs%" echo set FilesInZip=objShell.NameSpace("%~2").items
>>"%vbs%" echo objShell.NameSpace("%~1").CopyHere(FilesInZip)
>>"%vbs%" echo Set fso = Nothing
>>"%vbs%" echo Set objShell = Nothing
cscript //nologo "%vbs%"
if exist "%vbs%" del /f /q "%vbs%"
GOTO:eof
endlocal

否则,子例程不会return回到调用它的主要部分。

您必须每次都清理工作区。如果它不是代码存储库,您应该使用 jenkins workspace cleaner 插件。

将您的脚本放入批处理文件中。和 运行 它来自 jenkins "Execute Windows Batch Command" 像这样。

call "C:\Scripts\mycustombatch.bat" myparameter1 "myparameter2"

您的批处理脚本文件如下所示。 %1 是第一个参数。您应该修改并添加更多参数..

xcopy %1 %2 /y

您应该使用免费的解压程序,例如 7zip 工具。安装完成后,直接使用下面的命令即可。

"C:\Program Files-Zipz.exe" e "C:\myzipfile.7z" -o"C:\ExtractedFolder" *.* -r -y

或使用批处理文件参数化并从 jenkins 调用 bat 文件。

call "C:\Scripts\mycustombatch.bat" "%WORKSPACE%\myzipfile.7z" "C:\ExtractedFolder"

mycustombatch.bat

cd "C:\Program Files-Zip"
7z e %1 -o%2 *.* -r -y

7z.exe 用法示例:

http://www.dotnetperls.com/7-zip-examples