如果处于超时倒计时阶段,批处理文件在关机时无法正确终止

如果处于超时倒计时阶段,批处理文件在关机时无法正确终止

在我的 Win10 1909 PC 上,我最近发现,如果我在批处理文件等待超时命令时关机/重新启动,那么它不会直接终止,而只是超时命令终止,并且批处理文件将继续执行接下来的几个指令。

例如如果我运行批处理文件:

 timeout /nobreak 60000
 echo %time%>> "%UserProfile%\Desktop\ThisShouldntExist.txt"

并重新启动,下次登录时我会在桌面上发现一个“ThisShouldntExist”文本文件。

我可能有几个正在运行的批处理文件正在等待超时阶段,并且不喜欢它们在不稳定的环境中执行某些超时后指令,如果我忘记在关机时手动关闭它们。

我的疑问是:首先,这是每个人都知道会发生的事情吗?

其次,你能想到我可以在我的关机批处理脚本中添加几行代码吗,这样在关闭 PC 之前,除了它自己之外,其他所有正在运行的批处理文件都会被关闭吗?如果有用的话,我有 NirCMD

编辑我已经在关机脚本中使用了强制。关机过程仍然只是最初结束超时倒计时,让批处理文件可以自由地再执行一秒或更长时间的进一步指令

答案1

关机时批处理文件无法正确终止

如果我在批处理文件等待超时命令时关闭/重新启动,那么它不会直接终止,而只会终止超时命令

这是预期的行为,因为通常情况下,shutdown程序有时间正常终止。例如,如果您在编辑器中打开了一个文档,系统会发出警告,以便您保存该文档。

如果您想强制立即关机,请使用以下/f选项:

/f Force running applications to close.
   This will not prompt for File-Save in any open applications.
   so will result in a loss of any unsaved data.

来源关机 - 关闭计算机 - Windows CMD - SS64.com

答案2

@echo off 

rem :: code until 
rem :: to kill any process

set "_kill=cmd.exe timeout.exe"
set "_title=Keep_Yourself_Alive"
<con: title <nul & title %_title%

pushd %__AppDir__% && for /f tokens^=1^,3delims^=^" %%i in ('
tasklist /v /fo csv ^|findstr /i "%_kill%"^|findstr /vi "%_title%"
')do 2>nul <con: taskkill.exe /f /pid %%j >nul | echo\Bye Bye %%j:%%i

<con: rem./ & shutdown /and /your /flags /here & popd 
rem :: more code came here, after to kill process ... 

  • 我从来没有意识到要Shutdown专心等待Timeout好事发生......

1.为您的球棒指定一个唯一的标记Title

@echo off 
Title Keep_Yourself_Alive

2.列出每个For /F过程以及和:​PIDCMDTimeoutTasklistFinsdtr

for /f tokens^=3delims^=^" %%i in ('tasklist /v /fo csv|findstr "cmd.exe timeout.exe"... 

3.一个额外的Findstr可以用于仅列出PIDs您的不匹配的独特的蝙蝠Title

... ^|findstr /vi "Keep_Yourself_Alive" ... 

4.使用TaskkillwithPID来消除整个CMD.exe+Timeout进程(如果正在运行*)

... ')do taskkill /F /PID %%i

其他资源:

相关内容