我正在进行一些代码测试,我偶然发现了一个无法找到或修复的问题。我的问题是:
如果用户意外关闭了cmd窗口,我想在实际关闭之前执行批处理代码。 例如:
我运行脚本A.bat。当用户想要退出时,我希望它删除我的B.bat然后关闭窗口。
这就是代码的样子:
@ECHO OFF
echo Welcome to A.bat
del B.bat (when user exits the window)
我无法在谷歌和论坛上找到它,所以我想也许你们可以帮助我。提前谢谢,Niels
答案 0 :(得分:3)
这对我有用:
@ECHO OFF
if "%1" equ "Restarted" goto %1
start "" /WAIT /B "%~F0" Restarted
del B.bat
goto :EOF
:Restarted
echo Welcome to A.bat
echo/
echo Press any key to end this program and delete B.bat file
echo (or just close this window via exit button)
pause
exit
编辑:添加了一些解释
start
命令在新的cmd.exe会话中重新启动相同的批处理文件; / B开关在同一窗口中打开它,/ WAIT开关使原始文件等到新文件结束。新的批处理文件必须以exit
结束才能终止新的cmd.exe会话(因为它是使用/ K开关启动的)。如果新的cmd.exe会话正常结束,因为exit
命令或因为它被红色X取消,则无关紧要;在任何情况下,控件都会在原始执行中启动它之后返回。
答案 1 :(得分:0)
我必须做一些类似于你所描述的事情。我不确定这是否是最简单或最有效的方式来完成你的要求,但它确实可行。
@echo off
setlocal
:lockFile
rem // create lock file to inform forked helper thread when this thread completes
rem // credit to dbenham: http://stackoverflow.com/a/27756667/1683264
set "lockFile=%temp%\%~nx0_%time::=.%.lock"
9>&2 2>NUL (2>&9 8>"%lockFile%" call :main %*) || goto :lockFile
del "%lockFile%"
exit /b
:main
call :cleanup_watcher "B.bat"
rem // put your main script here
pause
goto :EOF
:cleanup_watcher <file> (<file> <file> etc.)
rem // Write external script to delete filename arguments
rem // (so if main script exits via ^C, temp files are still removed)
>"%temp%\tmp.bat" (
echo @echo off
echo setlocal
echo :begin
echo ping -n 1 -w 500 169.254.1.1 ^>NUL
echo del /q "%temp%\%~nx0*.lock" ^>NUL 2^>NUL
rem // If lockfile can't be deleted, the main script is still running.
echo if exist "%temp%\%~nx0*.lock" goto :begin
echo del /q "%temp%\tmp.bat" %* ^&^& exit
)
rem // fork cleanup watcher invisibly to catch ^C
>"%lockfile%.vbs" echo CreateObject("Wscript.Shell").Run "%temp%\tmp.bat", 0, False
wscript "%lockfile%.vbs"
del "%lockfile%.vbs"