使用bat命令时,有时需要将多个步骤合并成一个bat命令一起执行。
1、同时启动三个bat命令,并用不同的窗口执行
start a.bat
start b.bat
start c.bat
2、在上一个bat命令执行完成后再执行下一个命令
call a.bat
call b.bat
call c.bat
或者
start /wait a.bat
start /wait b.bat
start c.bat
两者的区别在于,call是在当前窗口调用其他bat命令进行执行,start是新开一个窗口执行bat命令。
如果是普通的bat命令,可以使用第一种方法,但如果是例如启动tomcat之类的不会马上完成执行的bat,就需要使用start来另起一个窗口执行命令。
因为tomcat的startup.bat命令启动后,会一直在当前窗口写log,所以下一个命令就不会在tomcat停止前执行。
注:call命令用的不是很熟,需要进一步验证
3、设置定时等待时间
比较强硬的方式是设置固定等待时间:
ping -n 15 127.0.0.1>nul
中间的15是等待时间,单位为秒,就是等待15秒的意思。
4、设置临时环境变量
有时需要临时使用某些工具,可以设置临时的环境变量来暂时解决问题。
比如设置jre的环境变量:
set PATH=%PATH%;%cd%\jre1.8.0_112\bin
此命令只生效于当前bat窗口,关闭后失效
%PATH%是环境变量的意思,使用以下命令可以查看当前环境变量的值:
echo %PATH%
%cd%表示的是此bat命令所在的文件路径,如果bat的路径为D:\a\b.bat,则%cd%表示为D:\a
5、使用bat命令制作关闭server
很多server并没有关闭命令,只能在启动的窗口中使用Ctrl+C来关闭服务,如果想要用命令行关闭一个已经启动的server,就只能简单粗暴的杀进程了。
比如说sonar:
taskkill /FI "WINDOWTITLE eq SonarQube"
netstat -ano | findstr 9000| findstr "LISTENING">C:\TEST\sonar_status.txt
for /f "delims=" %%a in (C:\TEST\sonar_status.txt) do (
set ipf=%%a
echo !ipf!
)
echo %ipf:~-5%
taskkill /F /FI "PID eq %ipf:~-5%"
netstat -ano | findstr 9001>C:\TEST\sonar_status.txt
for /f "delims=" %%a in (C:\TEST\sonar_status.txt) do (
set ips=%%a
echo !ips!
)
echo %ips:~-5%
taskkill /F /FI "PID eq %ips:~-5%"
taskkill命令是用来杀进程的,具体命令可通过taskkill /?查看
taskkill /FI "WINDOWTITLE eq SonarQube"
第一句命令是用来关闭sonar窗口的,WINDOWTITLE的意思是窗口名称,eq表示匹配,可添加*;ne表示除此之外的所有,需慎用;
最后跟的名称是sonar启动窗口的名称,如果启动窗口没有具体名称的话,可在使用start命令启动时把窗口名称加上去:
start "SonarQube" SonarQube.bat
netstat命令用来查询sonar的端口号9000,并将所有正在运行的9000端口的进程都输入到sonar_status.txt文件内
for /f "delims=" %%a in (C:\TEST\sonar_status.txt) do (
set ipf=%%a
echo !ipf!
)
上一段命令就是将sonar_status.txt文件内的内容一行一行的提取出来,并且赋值到ipf变量上去
echo %ipf:~-5%
打印ipf最后5个字符到屏幕上
taskkill /F /FI "PID eq %ipf:~-5%"
根据ipf最后的5个字符杀掉进程
因为sonar会起两个端口,9000和9001,所以需要将9001端口也做同样的操作:
netstat -ano | findstr 9001>C:\TEST\sonar_status.txt
for /f "delims=" %%a in (C:\TEST\sonar_status.txt) do (
set ips=%%a
echo !ips!
)
echo %ips:~-5%
taskkill /F /FI "PID eq %ips:~-5%"
其实taskkill /F /FI "PID eq %ips:~-5%"命令最好要放到for循环里面去,但是一般来说一个端口号只会占用一个进程,所以无所谓里面外面,只看最后一行的的进程号就可以了。
6、if语句
不太用,只写个格式
tasklist|find /i "mysqld.exe"
if %errorlevel% == 0 (
mysqladmin shutdown -uroot -p123456
) else (
echo mysql is not run
)
tasklist列出所有进程
如果查到了mysqld.exe这个进程,则关闭mysql服务,否则,echo输出。