在Windows下,执行startup.bat,就可以启动Tomcat
下面我们来看看startup.bat究竟干了什么?
先简单介绍下bat文件
1. bat文件
批处理文件,在DOS和Windows(任意版本)系统中,bat文件是可执行文件。bat文件由一系列命令构成
2. 执行bat文件
双击bat文件或在命令行下执行bat文件
3. startup.bat中涉及的bat语法
3.1 @、echo、echo off
@-关闭单行回显
打开回显:执行bat文件时,在cmd窗口可以看到bat内执行的命令和输出结果
关闭回显:执行bat文件时,在cmd窗口看不到bat内执行的命令,但可以看到输出结果
echo-显示echo后的字符
echo off-从下一条命令开始,关闭回显
@echo off-从本条命令开始,关闭回显(一般bat文件第一行都是这个)
3.2 rem
注释(::也可用做注释)
3.3 pause
暂停批处理的执行,并在屏幕上显示“Press any key to continue..."或"请按任意键继续...”的提示
3.4 call
调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)
3.5 获取系统变量
%+系统变量名+%,可以获得系统变量
创建Test1.bat
@echo off
echo %JAVA_HOME%
执行结果:
通过%JAVA_HOME%可以获取系统变量JAVA_HOME
3.6 setlocal、endlocal
setlocal和endlocal是让中间的程序对于系统变量的改变只在程序内起作用,不会影响整个系统。设置系统变量用set
创建Test2.bat
@echo off
setlocal
echo %JAVA_HOME%
set JAVA_HOME=CSDN
echo %JAVA_HOME%
endlocal
echo %JAVA_HOME%
执行结果:
首先执行setlocal,此时系统变量JAVA_HOME为”C:\Program Files\Java\jdk1.7.0_51”,然后通过set设置JAVA_HOME为”CSDN”,此时JAVA_HOME为”CSDN”,最后执行endlocal,此时JAVA_HOME恢复为”C:\Program Files\Java\jdk1.7.0_51”
3.7 传递参数
在cmd下执行bat文件,可以向bat文件传递参数。在bat内部用%1代表第一个参数,%2代表第二个参数,以此类推
创建Test3.bat
@echo off
echo %1
执行Test3.bat CSDN,执行结果:
3.8 if
if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令
3.8.1 if [not] "变量/参数" == "字符串" 待执行的命令
字符串是否相同。例:if "%1"=="a" echo “equal”
3.8.2 if [not] exist [路径\]文件名 待执行的命令
文件是否存在。例: if exist c:\a.txt echo “exits”
3.9 goto
批处理文件运行到这里将跳到goto所指定的标签(标签用”:标准字符串”来定义,标签所在行不被执行)处,goto语句一般与if配合使用,根据不同的条件来执行不同的命令组
创建Test4.bat
@echo off
set name="Tom"
if %name%=="Tom" goto Tom
:Jack
echo "Jack"
:Tom
echo "Tom"
goto end
:Vip
echo "Vip"
:end
执行结果:
运行bat过程中,if条件成立,跳到(goto)Tom标签继续执行,然后跳到end标签,结束
将name改为”Tom1”
@echo off
set name="Tom1"
if %name%=="Tom" goto Tom
:Jack
echo "Jack"
:Tom
echo "Tom"
goto end
:Vip
echo "Vip"
:end
执行结果:
运行bat过程中,if条件不成立,先进入Jack标签,然后进入Tom标签,然后跳到end标签,结束
3.10 shift
更改批处理文件中参数的位置
shift [/n]
n 为整数;[/n]为可选参数,当赋予n某个值时,就意味着从第n个参数开始移位;当n赋予的值为0,1或未赋值时,删除第一个参数,后面的参数左移一个位置
创建Test5.bat
@echo off
echo %1 %2
shift
echo %1
执行Test5.bat 1 2(传递两个参数:1和2),执行结果:
shift之后将第一个参数(1)删除,原来的第二个参数(2)成为第一个参数
--------------------------------------------------------------------------------------------------------------------------
下面我们来看看startup.bat文件,以下是删除注释(rem)之后的startup.bat
@echo off
if "%OS%" == "Windows_NT" setlocal
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
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end
@echo off-从本条命令开始开始,关闭回显
if "%OS%" == "Windows_NT" setlocal-判断是否为Windows系统。是,则执行setlocal
startup.bat的流程图
双击startup.bat,是按上图最左边的路线执行的
从上图可以看出,执行startup.bat相当于执行catalina.bat start
与startup.bat类似的bat还有configtest.bat、digest.bat、shutdown.bat、version.bat。这5个bat文件唯一的差别就是,在执行catalina.bat时所传递的参数不同
configtest.bat=catalina.bat configtest
digest.bat=catalina.bat -server org.apache.catalina.realm.RealmBase
shutdown.bat=catalina.bat stop
version.bat=catalina.bat version
看来catalina.bat才是核心!