从文件命名上看就知道这是一个启动批处理。这个批处理的主要功能就是为了找到还有一个批处理catalina.bat,而且运行catalina.bat。
一開始就用if "%OS%" == "Windows_NT" setlocal 推断系统是否为Windows_NT。假设是的话则使用setlocal命令,此命令表示之后全部对环境变量的改变仅仅限于该批处理文件。要还原原先的设置能够运行endlocal。如未显式运行,则会在批处理的最后自己主动隐性运行endlocal命令。
接下来这段脚本设置CATALINA_HOME环境变量,并终于确定catalina.bat的路径。如图3-2-1-1清晰表达了 CATALINA_HOME变量值确定的逻辑。
①假设系统变量设置了CATALINA_HOME。则直接使用系统变量设置的值作为tomcat安装文件夹。
②假如没设置系统变量CATALINA_HOME,则以批处理或命令行当前文件夹作为CATALINA_HOME。此时假设%CATALINA_HOME%incatalina.bat存在。则批处理或命令行当前文件夹作为CATALINA_HOME。③假如%CATALINA_HOME%incatalina.bat不存在,则把当前文件夹的上一级文件夹作为CATALINA_HOME,此时再推断%CATALINA_HOME%incatalina.bat是否存在,存在则当前文件夹的上一级文件夹就是CATALINA_HOME。
否则提示找不到CATALINA_HOME环境变量。
对于②跟③的情况可能比較easy产生疑问。②主要针对用命令行运行,命令行的当前文件夹是tomcat安装文件夹,运行binstartup.bat。③的情况可能是命令行运行,也可能是双击批处理运行。命令行运行是把当前文件夹切到tomcat安装文件夹in下,这两种运行方式的当前文件夹都是一样的。
********************************************************************************************
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%incatalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
if exist "%CATALINA_HOME%incatalina.bat" goto okHome
goto end
:okHome
set "EXECUTABLE=%CATALINA_HOME%incatalina.bat"
if exist "%EXECUTABLE%" goto okExec
goto end
:okExec
********************************************************************************************
图3-2-1-1
确定了CATALINA_HOME的值即已经确定了catalina.bat。
接下去是接受參数,在启动时常常会附带一些命令參数。startup.bat通过下面程序完毕对參数的收集。
********************************************************************************************
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 //将參数组成一行,接在后面
shift
goto setArgs
:doneSetArgs
********************************************************************************************
首先把CMD_LINE_ARGS设置环境变量为空。首先推断第一个參数是否为空,为空则表示没有參数。直接跳到doneSetArgs位置,假设第一个參数不为空。则把第一个參数赋给CMD_LINE_ARGS,shift命令的作用是把參数前移一位。这时%1代表的就是原来第二个參数,shift后又跳到setArgs位置。此时推断的是第二个參数,假设不为空则把參数追加到CMD_LINE_ARGS。
以此类推。把參数一个个前移,直到%1为空,则表示全部參数都已经收集完。
call "%EXECUTABLE%" start %CMD_LINE_ARGS%,这条命令是把刚刚收集好的全部參数CMD_LINE_ARGS作为參数,调用运行catalina.bat批处理。