YASJW 批处理脚本中的路径行为不一致

Inconsistent behaviour with paths in YASJW batch scripts

我们公司希望轻松地将我们的 Java 服务器应用程序安装为 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

我发现了问题,问题是,在 uninstallScript.bat 中我使用了 call 两次,第一次调用更改了工作目录,因为我使用的是相对路径秒调用在解析路径时遇到问题。

为了修复它,我在开头插入了一个 pushd 并将当前目录作为参数,在第一个 call 之后插入了一个 popd.

文件现在看起来像这样:

pushd %~dp0
call stopService.bat
popd
call lib\YAJSW\bat\uninstallService.bat