bat 根據目錄啓動與關閉程序

任務要求:
編寫start.bat/stop.bat 啓動與停止應用程序,start.bat同時需要作爲守護進程運行,在檢測到程序關閉之後需要主動拉起,程序需要能夠多版本運行,根據目錄區分。例如在a/test.exe b/test.exe 兩個程序,可以同時啓動,點擊相應目錄下start.bat,啓動相應test.exe,點擊stop.bat只停止相應目錄下的守護程序與應用程序。
實現方式如下,考慮到bat腳本作爲守護進程一直在前臺,會被誤關閉,所以使用vbs腳本作爲啓動腳本(start.vbs):

Set copy_cmd = CreateObject("Scripting.FileSystemObject")
copy_cmd.CopyFile "C:\\Windows\\system32\\cmd.exe",".\cmd.exe"
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd.exe /c script\\startdwzqtrans.bat",vbhide

調用script目錄下(startdwzqtrans.bat)

@echo off
set _task=test.exe
set _pwd=%cd:\=\\%
set _pwd_script=%_pwd%\\script
set _svr=%_pwd%\\test.exe
set _des=script\\start.bat
set _process=wmic process where "name='%_task%' and ExecutablePath='%_svr%'" get name 

:checkstart
for /f "tokens=1 skip=1" %%n in ('%_process% ') do (
    echo %%n
if %%n==%_task% (goto checkag) else goto startsvr 
)

:startsvr
echo %time% 
echo ********Programe Starting********
echo Programe Start At: %time% ,Look at Log >> script\restart_service.txt
echo start %_svr% > %_des%
echo exit >> %_des%
start %_des%
set/p=.<nul
for /L %%i in (1 1 10) do set /p a=.<nul&ping.exe /n 2 127.0.0.1>nul
echo .
echo Wscript.Sleep WScript.Arguments(0) >%_pwd_script%\delay.vbs 
cscript //b //nologo %_pwd_script%\delay.vbs 10000 
del %_des% /Q
echo ********Programe complete********
goto checkstart

:checkag
echo %time% Programe Running,10s try check.. 
echo Wscript.Sleep WScript.Arguments(0) >%_pwd_script%\delay.vbs 
cscript //b //nologo %_pwd_script%\delay.vbs 10000 
goto checkstart

到此啓動腳本結束。

停止腳本相對簡單(stop.bat):

@echo off
set _task=test.exe
set _svr=%cd:\=\\%\\test.exe
set _task_bg=cmd.exe
set _svr_bg=%cd:\=\\%\\cmd.exe
set _process=wmic process where "name='%_task%' and ExecutablePath='%_svr%'" get name 

::checkstart
::for /f "tokens=1 skip=1" %%n in ('%_process% ') do (
::if %%n==%_task% (goto stopsvr) else goto echostatus
::)

:stopsvr
echo ********Programe Stoping********
echo Programe Stop At: %time% ,Look at Log >> script\restart_service.txt
echo Programe Stop At: %time%
wmic process where "name='%_task_bg%' and ExecutablePath='%_svr_bg%'"  call Terminate >nul
wmic process where "name='%_task%' and ExecutablePath='%_svr%'"  call Terminate >nul
echo ********Programe Stop complete********
pause;
:::echostatus
::echo %time% 
::echo ********No find cmd running********

注意:
如果在start.vbs中不拷貝一份cmd.exe到當前目錄,則會使用c:/windows/system32目錄下cmd,這樣就無法區分不同版本運行的後臺守護進程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章