当用户点击退出时执行批处理代码
Execute batch code when user click on exit
我正在进行一些代码测试,我偶然发现了一个我找不到或无法修复的问题。我的问题是:
如果用户不小心关闭了 cmd window,我想在它真正关闭之前执行批处理代码。 例如:
我 运行 脚本 A.bat 。当用户要退出时,我希望它删除我的 B.bat 然后关闭 window。
代码可能如下所示:
@ECHO OFF
echo Welcome to A.bat
del B.bat (when user exits the window)
我在 google 和论坛上找不到它,所以我想也许你们可以帮助我。提前致谢,尼尔斯
我不得不做一些与您描述的类似的事情。我不确定这是否是完成您所要求的最简单或最有效的方法,但它确实有效。
@echo off
setlocal
:lockFile
rem // create lock file to inform forked helper thread when this thread completes
rem // credit to dbenham:
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"
这对我有用:
@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 开关在相同的 window 中打开它,而 /WAIT 开关使原始文件等待直到新文件结束。新的批处理文件必须以 exit
结尾,以便终止新的 cmd.exe 会话(因为它是使用 /K 开关启动的)。不管新的 cmd.exe 会话是因为 exit
命令正常结束还是因为它被红色 X 取消了;在任何情况下,控件 returns 在原始执行中启动它的行之后。
我正在进行一些代码测试,我偶然发现了一个我找不到或无法修复的问题。我的问题是:
如果用户不小心关闭了 cmd window,我想在它真正关闭之前执行批处理代码。 例如:
我 运行 脚本 A.bat 。当用户要退出时,我希望它删除我的 B.bat 然后关闭 window。
代码可能如下所示:
@ECHO OFF
echo Welcome to A.bat
del B.bat (when user exits the window)
我在 google 和论坛上找不到它,所以我想也许你们可以帮助我。提前致谢,尼尔斯
我不得不做一些与您描述的类似的事情。我不确定这是否是完成您所要求的最简单或最有效的方法,但它确实有效。
@echo off
setlocal
:lockFile
rem // create lock file to inform forked helper thread when this thread completes
rem // credit to dbenham:
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"
这对我有用:
@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 开关在相同的 window 中打开它,而 /WAIT 开关使原始文件等待直到新文件结束。新的批处理文件必须以 exit
结尾,以便终止新的 cmd.exe 会话(因为它是使用 /K 开关启动的)。不管新的 cmd.exe 会话是因为 exit
命令正常结束还是因为它被红色 X 取消了;在任何情况下,控件 returns 在原始执行中启动它的行之后。