調用方要求把windows下幾個互相調用的web服務封裝為exe形式。為了方便調用方使用,要求提供啟動和關閉bat腳本。
啟動腳本start.bat
@echo off set port_backend=5000 start "ne_backend" cmd /k call start_backend.bat echo 等待后端啟動完成... :start for /f "tokens=3 delims=: " %%a in ('netstat -an') do ( if "%%a"=="%port_backend%" goto end ) goto start :end echo 啟動前端... start "ne_frontend" cmd /k call start_frontend.bat exit
總腳本負責維護啟動順序和端口。
一共啟動2個exe,一個backeend 一個frontend 位置不同。
通過等待端口,判斷backen啟動完成,用goto語句 跳出循環,然后再啟動下一個frontend
所以單獨寫兩個各自的啟動腳本start_backend.bat start_frontend.bat
用start 新啟動每個窗口。start的第一個參數 規定了啟動后控制台的窗口 title文字。用於關閉時根據這個關閉。 這樣避免了具體exe的名字
最后是exit 全部啟動完畢后,這個start.bat總腳本就退出了,只剩2個獨立的控制台在運行。
具體啟動腳本大同小異,主要是切換當前工作路徑(current work Directory),直接啟動exe程序,也不退出。
start_backend.bat
@echo off %~d0 cd %~dp0 cd "./backend" app
start_frontend.bat
@echo off %~d0 cd %~dp0 frontend
關閉腳本end.bat
@echo off taskkill /fi "WindowTitle eq ne_frontend*" taskkill /fi "WindowTitle eq ne_backend*"
因為實際窗口名是這樣的:
但是我懶得抄后面啰嗦的語句了,而且有空格 也不知道怎么嵌套進
"WindowTitle eq ne_frontend*"
這樣的雙引號語句里。所以干脆用*模糊匹配了。
但是 萬一系統里其他運行的exe(或者啟動了我們的exe之后,又啟動了別的exe),恰好別的exe的窗口title和我們這倆前綴重名,運行end.bat 就可能關閉錯了。
為了防止這個問題,在start.bat腳本里 對每個窗口名都加了自定義前綴"ne_" 也可以加別的,更復雜點,保證沒別的程序會這樣。
有點類似C++用#if define 防止重復include 頭文件