Почему выполнение пакетного файла завершается неудачей ТОЛЬКО В Jenkins с сообщением об ошибке, что сжатый файл .rar не существует? - PullRequest
0 голосов
/ 25 сентября 2018

Я создал простой командный файл, который создает резервную копию моего каталога Jenkins.Все работает без сбоев, но как только я настроил build с помощью « Выполнить пакетную команду Windows », пакетный файл потерпит неудачу, сообщив: «Файл уже существует или не найден(свободный перевод с немецкого). Однако, запуск сценария локально с взаимодействием с пользователем работает просто отлично!

@echo off &color 1f && Title [Backup for Jenkins]

REM Path for Winrar
set path="C:\Program Files\WinRAR\";%path%

REM German Date-Format
set gerDate=%date:~0,2%-%date:~3,2%-%date:~6,4%

REM Winrar Backup
REM Base-Folder skipped
rar a -u -ep1 -r -agHH-MM -xC:\[Path for 1st skipped folder]\ -xC:\[Path for 2nd skipped folder] Jenkins_%gerDate%_.zip C:\[Path to compress all the following files]\*.*
color 2f & Title [Backup successful]

echo.
echo Move into different folder
echo.
move C:\[Path to the generated .zip file]\Jenkins*.zip C:\[Path to destination folder - network drive]\
echo.
echo Backup completed on%Date% %Time% 
echo.
pause

Я заметил, что мой сценарий временно хранится в C: \ Users\ [USER] \ AppData \ Local \ Temp и так как сценарий должен переместить сжатый .rar с помощью команды cmd «переместить» в другую папку, это может вызвать мои проблемы ... В любом случае, мой .rarне генерируется даже в папке Temp, так что это может быть не так.

1 Ответ

0 голосов
/ 25 сентября 2018

Первая ошибка в строке:

set path="C:\Program Files\WinRAR\";%path%

Правильно будет

set "path=C:\Program Files\WinRAR;%path%"

Путь к папке в списке разделенных точкой с запятой путей к папкам, назначенных переменной среды PATH, не должензаключать в двойные кавычки, за исключением того, что путь к папке содержит одну или несколько точек с запятой.Путь к папке также должен быть без обратной косой черты в конце.

Однако эта строка на самом деле не является проблемой и, конечно, также не нужна вообще, как это видно из кода пакетного файла ниже.

См. Также Почему нет строкового вывода с 'echo% var%' после использования 'set var = text' в командной строке? для объяснения, почему остался один ", оставленный именем переменной средыи еще один " в конце строки аргумента.


Вторая ошибка - вся строка:

set gerDate=%date:~0,2%-%date:~3,2%-%date:~6,4%

Эта строка, скорее всего, является реальной проблемой.

Я полагаю, что для вашей учетной записи пользователя настроена страна Германия, в результате чего формат даты DD.MM.YYYY означает 25.09.2018.

Но Jenkins работает как служба с системной учетной записью, которая, скорее всего, используетдругой формат даты, такой как, например, английский, США, в результате чего строка даты Tue, 09/25/2018.

Итак, getDate равно Tu-, -9/25 вместо 25-09-2018, а / интерпретируется как разделитель каталогов, такой как \, которыйнастоящий разделитель каталогов в Windows.

По этой причине Jenkins_%gerDate%_.zip становится при исполнении Jenkins Jenkins_Tu-, -9/25_.zip и Rar.exe не может найти в текущем каталоге подкаталог Jenkins_Tu-, -9 для создания файла 25_HH-MM.zipв этом каталоге.

См. также % date% приводит к другому результату в пакетном файле при запуске из запланированных задач на сервере 2016 .


Третья ошибка заключается в использованииRar.exe с указанием расширения файла .zip.Инструкция для консольной версии Rar.exe представляет собой текстовый файл Rar.txt в папке с программными файлами WinRAR .В верхней части этого текстового файла можно прочитать, что Rar.exe поддерживает только RAR формат файла архива.Таким образом, все созданные архивы представляют собой RAR, а не ZIP-архивы, хотя расширение файла .zip.


Интересно, что переключатель -ag используется с HH-MM, хотя Rar.exe также поддерживаетдобавление не только текущего часа и минуты, но и текущей даты в настраиваемом формате с использованием -ag для архивирования имени файла перед расширением файла.

Таким образом, командная строка set gerDate=... вообще не требуется при создании пакетаприведенный ниже код не зависит от настроек региона используемой учетной записи.


Далее руководство по Rar.exe описывает, что *.* не интерпретируется как *, как это делает командный процессор Windows.*.* означает, что на самом деле файл для добавления в архив должен иметь точку в имени файла, или Rar.exe игнорирует файл.Похоже, что каталог должен быть рекурсивно добавлен в архив с обновлением существующих файлов в архиве и с исключением двух каталогов.По этой причине следует использовать только * или не использовать подстановочный знак в конце пути к папке для архива, так как * является значением по умолчанию, когда подстановочный знак не используется.

См. Также Просто сожмите 1 папкув пакете с командной строкой WinRAR? для объяснения, почему указанный путь к папке в приведенном ниже коде пакетного файла заканчивается обратной косой чертой.


Rar.exe может создать файл архива в любом существующем каталоге.Нет необходимости создавать его в текущем каталоге и затем перемещать файл в каталог назначения.


Руководство Rar.txt содержит в нижней части возможные коды выхода.

Так что этоможно проверить, произошла ли какая-либо ошибка с if errorlevel 1, что означает, что код завершения больше или равен 1 , как описано с помощью команды IF , выводится при запуске в окне командной строки if /?.

if not errorlevel 1 противоположен, то есть код выхода ниже 1 , что означает равное 0, так как Rar.exe никогда не завершается с отрицательным значением, так как почти все приложения и команды.


Итак, давайте объединим всю эту информацию в новый пакетный файл:

@echo off
color 1f
title [Backup for Jenkins]

rem WinRAR backup, base folder skipped
"C:\Program Files\WinRAR\rar.exe" u -agYYYY-MM-DD_HH-MM -ep1 -r -inul -x"C:\[Path for 1st skipped folder]\" -x"C:\[Path for 2nd skipped folder]" "C:\[Path to destination folder - network drive]\Jenkins_.rar" "C:\[Path to compress all the following files]\"

if not errorlevel 1 color 2f & title [Backup successful]
echo Backup completed on %DATE% %TIME%
echo/
pause

Я также добавил -inul, который отключает весь вывод на консоль и неявно приводит к тому, что пользователь никогда не запрашивает, как при использовании дополнительно переключателя -y, который в противном случае должен использоваться здесь, например при использовании -icdpq вместо -inulчтобы получить выходные сообщения об ошибках, которые захватывает Дженкинс, но никакой другой информации о состоянии.

...