在我的 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.
答案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
过程以及和:PID
CMD
Timeout
Tasklist
Finsdtr
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.使用Taskkill
withPID
来消除整个CMD.exe
+Timeout
进程(如果正在运行*)
... ')do taskkill /F /PID %%i
其他资源: