从文件命名上看就知道这是一个启动批处理。这个批处理的主要功能就是为了找到还有一个批处理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%\bin\catalina.bat存在。则批处理或命令行当前文件夹作为CATALINA_HOME。③假如%CATALINA_HOME%\bin\catalina.bat不存在,则把当前文件夹的上一级文件夹作为CATALINA_HOME,此时再推断%CATALINA_HOME%\bin\catalina.bat是否存在,存在则当前文件夹的上一级文件夹就是CATALINA_HOME。

否则提示找不到CATALINA_HOME环境变量。

对于②跟③的情况可能比較easy产生疑问。②主要针对用命令行运行,命令行的当前文件夹是tomcat安装文件夹,运行bin\startup.bat。③的情况可能是命令行运行,也可能是双击批处理运行。命令行运行是把当前文件夹切到tomcat安装文件夹\bin下,这两种运行方式的当前文件夹都是一样的。

********************************************************************************************

set "CURRENT_DIR=%cd%"

if not "%CATALINA_HOME%" == "" goto gotHome  

set "CATALINA_HOME=%CURRENT_DIR%"  

if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome  

cd ..  

set "CATALINA_HOME=%cd%"  

cd "%CURRENT_DIR%"   

:gotHome

if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome  

goto end

:okHome

set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"   

if exist "%EXECUTABLE%" goto okExec   

goto end

:okExec

********************************************************************************************


tomcat启动批处理——startup.bat_tomcat安装

 

图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批处理。

 ​