【问题标题】:Execute batch code when user click on exit当用户单击退出时执行批处理代码
【发布时间】:2015-08-14 13:55:30
【问题描述】:

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

如果用户不小心关闭了 cmd 窗口,我想在它实际关闭之前执行一个批处理代码。 例如:

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

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

我在谷歌和论坛上找不到它,所以我想也许你们可以帮助我。在此先感谢 Niels

【问题讨论】:

  • 你的意思是如果他们点击红色的 X ?无法在批处理脚本中检测到它并对此采取任何措施。
  • @foxidrive 是的,我是这个意思。如果不可能,我是否可以阻止用户点击它,或者是否可以替代?
  • 没有。它不能被禁用,因为它是一个基本的 Windows 功能。您可以运行第二个批处理文件来检测第一个批处理文件是否关闭 - 但它很笨拙。

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


【解决方案1】:

这对我有用:

@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 取消;在任何情况下,控件都会在原始执行中启动它的行之后返回。

【讨论】:

  • 非常感谢!我正在弄清楚一切的含义,但是您添加了解释:)。谢谢!!
  • @Aacini 不错!我没想到这会处理用红色 X 关闭,但确实如此。
【解决方案2】:

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

@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"

【讨论】:

    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多