Непоследовательное поведение с путями в пакетных сценариях YASJW

Наша компания хочет легко установить наше приложение Java Server в качестве службы Windows, поэтому мы используем YAJSW для упаковки приложения. Чтобы сделать его немного более удобным, я создал несколько небольших пакетных сценариев, которые просто требуют щелчка для установки / удаления / запуска / остановки службы.

Установка, запуск и остановка работают нормально, но при использовании удаления я получаю сообщение об ошибке, что какой-то файл не может быть найден. Все они используют одну и ту же конфигурацию оболочки, и все командные файлы лежат в одном и том же месте. Так почему же не удается найти файл, а другие нет?

Вот моя структура папок:

lib\
|---YAJSW
    |----bat\
    |    |--- installService.bat
    |    |--- uninstallService.bat
    |    |--- and so on
    |----conf\
         |--- wrapper.conf
MyApplication.jar
installService.bat      //Basically a proxy batch doing some other stuff and then calling the original installService.bat
uninstallService.bat    //Also a proxy
startService.bat        //Proxy
stopService.bat         //Proxy

Это два исходных файла, один из рабочих и тот, который не работает:

Здесь uninstallService.bat:

pushd %~dp0
call setenv.bat
%wrapper_bat% -r %conf_file%
popd

и вот installService.bat:

pushd %~dp0
call setenv.bat
%wrapper_bat% -i %conf_file%
popd

Если кто-то задается вопросом, где %conf_file% исходит от того, что устанавливается setenv.bat так же, как и остальные необходимые вещи для запуска задач.

Они одинаковы, за исключением того, что один проходит -r вместо -i,

Во всяком случае, это мои прокси-файлы:

installService.bat который работает нормально:

::Make a clean copy of our default config
xcopy /y /Q lib\YAJSW\conf\wrapper.conf.default lib\YAJSW\conf\wrapper.conf

::Set current workingdirectory to current executing directory
SET workingdir=%cd%

::Replace all backslashes with 4 backslashes to keep YAJSW functioning
SET workingdirFixed=%workingdir:\=/%

::Set the working directory to the variable that we set up before
echo wrapper.working.dir=%workingdirFixed% >> lib\YAJSW\conf\wrapper.conf

::Call the install batch file which uses the config that we have created
call lib\YAJSW\bat\installService.bat

а также uninstallService.bat который не работает:

call stopService.bat
call lib\YAJSW\bat\uninstallService.bat

Я действительно понятия не имею, что здесь не так.

редактировать

setenv.bat:

@echo off
rem quotes are required for correct handling of path with spaces

rem default java home
set wrapper_home=%~dp0/..

rem default java exe for running the wrapper
rem note this is not the java exe for running the application. the exe for running the application is defined in the wrapper configuration file
set java_exe="java"
set javaw_exe="javaw"

rem location of the wrapper jar file. necessary lib files will be loaded by this jar. they must be at <wrapper_home>/lib/...
set wrapper_jar="%wrapper_home%/wrapper.jar"
set wrapper_app_jar="%wrapper_home%/wrapperApp.jar"

rem setting java options for wrapper process. depending on the scripts used, the wrapper may require more memory.
set wrapper_java_options=-Xmx30m -Djna_tmpdir="%wrapper_home%/tmp" -Djava.net.preferIPv4Stack=true

rem wrapper bat file for running the wrapper
set wrapper_bat="%wrapper_home%/bat/wrapper.bat"
set wrapperw_bat="%wrapper_home%/bat/wrapperW.bat"

rem configuration file used by all bat files
set conf_file="%wrapper_home%/conf/wrapper.conf"

rem default configuration used in genConfig
set conf_default_file="%wrapper_home%/conf/wrapper.conf.default"

wrapper.bat:

echo %java_exe% %wrapper_java_options% -jar %wrapper_jar% %1 %2 %3 %4 %5 %6 %7 %8 %9
%java_exe% %wrapper_java_options% -jar %wrapper_jar% %1 %2 %3 %4 %5 %6 %7 %8 %9

1 ответ

Решение

Я нашел проблему, проблема была в том, что в uninstallScript.bat я использовал call два раза первый вызов изменял рабочий каталог, так как я работал с относительными путями, а у секундного вызова были проблемы с разрешением путей.

Чтобы исправить это, я вставил pushd с текущим каталогом в качестве параметра в начале и после первого call popd,

Файл теперь выглядит так:

pushd %~dp0
call stopService.bat
popd
call lib\YAJSW\bat\uninstallService.bat 
Другие вопросы по тегам