用户单击退出

时间:2015-08-14 13:55:30

标签: windows batch-file cmd batch-processing exit

我正在进行一些代码测试,我偶然发现了一个无法找到或修复的问题。我的问题是:

如果用户意外关闭了cmd窗口,我想在实际关闭之前执行批处理代码。 例如:

我运行脚本A.bat。当用户想要退出时,我希望它删除我的B.bat然后关闭窗口。
这就是代码的样子:

@ECHO OFF
echo Welcome to A.bat
del B.bat (when user exits the window)

我无法在谷歌和论坛上找到它,所以我想也许你们可以帮助我。提前谢谢,Niels

2 个答案:

答案 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"