Windows 当用户单击退出时执行批处理代码

Windows 当用户单击退出时执行批处理代码,windows,batch-file,cmd,batch-processing,exit,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) 我在谷歌和论坛上都找不到,所以我想也许你们可以帮我。提前谢谢你,尼尔斯,我不得不做一些与你描述的相似的

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

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

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

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

我在谷歌和论坛上都找不到,所以我想也许你们可以帮我。提前谢谢你,尼尔斯,我不得不做一些与你描述的相似的事情。我不确定这是实现你要求的最简单还是最有效的方法,但它确实有效

@echo关闭
setlocal
:锁文件
rem//创建锁文件,在该线程完成时通知forked helper线程
rem//归功于dbenham:http://stackoverflow.com/a/27756667/1683264
设置“lockFile=%temp%\%~nx0\%time::=.%.lock”
9> &2>NUL(2>&9 8>“%lockFile%”调用:main%*)| |转到:lockFile
删除“%lockFile%”
退出/b
:main
呼叫:清理观察者“B.bat”
rem//将主脚本放在这里
暂停
后藤:EOF
:清理观察者(等)
rem//编写外部脚本以删除文件名参数
rem//(因此,如果主脚本通过^C退出,临时文件仍将被删除)
>%temp%\tmp.bat(
回声@回声关闭
回声集本地
回声:开始
回声平-N1-W500 169.254.1.1^>NUL
回显del/q“%temp%\%~nx0*.lock”^>NUL 2^>NUL
rem//如果无法删除lockfile,则主脚本仍在运行。
如果存在回显“%temp%\%~nx0*.lock”转到:开始
echo del/q“%temp%\tmp.bat”%*^&^退出
)
rem//fork cleanup watcher不可见地捕获^C
>“%lockfile%.vbs”回显CreateObject(“Wscript.Shell”)。运行“%temp%\tmp.bat”,0,False
wscript“%lockfile%.vbs”
删除“%lockfile%.vbs”

我不得不做一些类似于您所描述的事情。我不确定这是实现你要求的最简单还是最有效的方法,但它确实有效

@echo关闭
setlocal
:锁文件
rem//创建锁文件,在该线程完成时通知forked helper线程
rem//归功于dbenham:http://stackoverflow.com/a/27756667/1683264
设置“lockFile=%temp%\%~nx0\%time::=.%.lock”
9> &2>NUL(2>&9 8>“%lockFile%”调用:main%*)| |转到:lockFile
删除“%lockFile%”
退出/b
:main
呼叫:清理观察者“B.bat”
rem//将主脚本放在这里
暂停
后藤:EOF
:清理观察者(等)
rem//编写外部脚本以删除文件名参数
rem//(因此,如果主脚本通过^C退出,临时文件仍将被删除)
>%temp%\tmp.bat(
回声@回声关闭
回声集本地
回声:开始
回声平-N1-W500 169.254.1.1^>NUL
回显del/q“%temp%\%~nx0*.lock”^>NUL 2^>NUL
rem//如果无法删除lockfile,则主脚本仍在运行。
如果存在回显“%temp%\%~nx0*.lock”转到:开始
echo del/q“%temp%\tmp.bat”%*^&^退出
)
rem//fork cleanup watcher不可见地捕获^C
>“%lockfile%.vbs”回显CreateObject(“Wscript.Shell”)。运行“%temp%\tmp.bat”,0,False
wscript“%lockfile%.vbs”
删除“%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开关在同一窗口中打开它,/WAIT开关使原始文件等待,直到新文件结束。新的批处理文件必须以
exit
结束才能终止新的cmd.exe会话(因为它是用/K开关启动的)。无论新cmd.exe会话是否因
退出
命令或因红色X取消而正常结束;在任何情况下,控件都会在原始执行中启动它的行之后返回。

这对我来说很有用:

@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会话是否因
退出
命令或因红色X取消而正常结束;在任何情况下,控件都会在原始执行中启动它的行之后返回。

您的意思是如果他们单击红色的X?无法在批处理脚本中检测到这一点,也无法对此采取任何措施。@foxidrive是的,我是说。如果这是不可能的,我可以阻止用户点击它吗?或者这不可能作为替代方案吗?不。它不能被禁用,因为它是一个基本的Windows功能。你可以运行第二个批处理文件来检测第一个批处理文件是否关闭,但这很笨拙。你是说如果他们点击红色的X?无法在批处理脚本中检测到这一点,也无法对此采取任何措施。@foxidrive是的,我是说。如果这是不可能的,我可以阻止用户点击它吗?或者这不可能作为替代方案吗?不。它不能被禁用,因为它是一个基本的Windows功能。您可以运行第二个批处理文件来检测第一个批处理文件是否关闭,但这很笨拙。非常感谢!我想弄明白一切的意思,但你加了解释:)。谢谢@阿奇尼很好!我没想到这可以用红色的X来结束,但确实如此。非常感谢!我想弄明白一切的意思,但你加了解释:)。谢谢@阿奇尼很好!我没想到这会处理红色X的结束,但它确实如此。