Fork me on GitHub

监控自身BAT进程关闭(控制台退出时得到通知)

原创文章,未经允许,请勿转载

今天有个需求,需要使用bat开启多个进程,然后在bat被人为关闭窗口时,可以清理之前通过bat开启的进程,于是就有了下面的脚本,该脚本可以监控自身BAT进程关闭,在进程关闭时可以做清理,或者别的工作(比如用来清理主进程开启的其他程序,甚至可以再重新启动一个进程达到守护自身进程的效果?),其实现原理是开启一个新的隐藏进程,隔几秒检查一下主进程是否退出,如果主进程已退出则执行clean过程

onkill.bat

@echo off
echo ****************************************************
echo *       author:https://yoyo.play175.com/           *
echo ****************************************************

pushd %~dp0

if "%1" == "autoclean" goto :autoclean   

REM 获得当前CMD进程PID
set TempFile=%TEMP%\__ParentProcessId.tmp
wmic process where (Name="wmic.exe" AND CommandLine LIKE "%%%TIME%%%") get ParentProcessId /value | find "ParentProcessId" >%TempFile%
set /P _string=<%TempFile%
set _pid=%_string:~16%

REM 隐式启动autoclean进程...
mshta vbscript:createobject("wscript.shell").run("%~nx0 autoclean %_pid% ""%~dp0""",0)(window.close)
goto :main
exit

REM autoclean进程代码
:autoclean
pushd %3
timeout /t 3 /NOBREAK >nul
(TASKLIST /FI "IMAGENAME eq cmd.exe" /FI "PID eq %2"|findstr "cmd.exe">nul&&goto :autoclean)||goto :clean
exit

:clean
    REM 这里写清理脚本
    REM 下面这行是示例代码,主进程结束时,写入一段文字到文本文件,来证明clean确实被执行了
    echo %time% cleaned > cleaned.txt

exit

:main
    REM 这里写主脚本
    REM 下面是示例代码,隔几秒往屏幕输出一行文字
    echo %time% main running...
    timeout /t 3 /NOBREAK >nul
    goto :main

来源:悠游悠游,2018-08-27,原文地址:https://yymmss.com/p/bat-kill-notify.html