如何在使用 TASKKILL /f /t /im explorer.exe 时保持批处理文件运行?

Posted

技术标签:

【中文标题】如何在使用 TASKKILL /f /t /im explorer.exe 时保持批处理文件运行?【英文标题】:How to keep batch file running whilst using TASKKILL /f /t /im explorer.exe? 【发布时间】:2020-09-01 21:34:57 【问题描述】:

简而言之,我需要启动1.bat,可以CALLSTART2.bat执行TASKKILL /im explorer.exe /f /t但保持“1.bat”运行(或重新打开它) 一旦“2.bat”完成。困难在于,我需要将/t 开关保留在TASKKILL 中以使其可转移。

完整说明: 我有几台运行 Windows 7 x64 的旧笔记本电脑。他们将运行游戏,但只有当我使用任务管理器结束资源管理器时,它才会关联进程并停止几个不需要的服务。这可以释放 RAM 和 CPU 以通过任务管理器启动游戏..

为了避免每次都单独结束每个进程/服务,我写了2个cmd批处理文件:


1) Options.bat --(缩短)

@echo off
:begin
echo (0) Kill Processes
echo (1) Run [game]
SET /p op=Select Task:
if "%op%"=="0" goto killall
if "%op%"=="1" goto op1
killall:
CALL "C:\TK.bat"
cls
goto begin
op1:
start " " /realtime "C:\[exe path]"
goto exit
:exit
exit

2) TK.bat -- (缩短)

net stop [service]
taskkill /im explorer.exe /f /t
taskkill /im [specific process].exe /f /t

两者都按预期工作 - 前提是我最初是通过任务管理器启动 Options.bat。

问题:当我从 Windows 资源管理器(甚至“以管理员身份运行”)运行 Options.bat 并调用 TK.bat 脚本运行 TASKKILL /im explorer.exe /f /t 时,它确实有效,但也关闭了 CMD窗口,当我希望它返回选项选择时。当我为 TASKKILL 使用“树”属性时,这确实有意义。

但是,如果我通过任务管理器运行 Options.bat 并 CALL TK.bat,它将执行命令(不关闭自身)然后返回到任务选择 - 这正是我想要发生的事情!我认为这是因为它通过任务管理器作为本地系统帐户运行,而不是我的或内置的管理员帐户?

我已经尝试过 Options.bat 中的RUNAS 命令 -

RUNAS /user:Adminstrator "C:\TK.bat"

运行TK.bat,执行TASKKILL 命令,然后再次执行RUNAS 以返回到我用户名中的第一个批处理文件。这确实有效,但我仍然必须在每个密码提示时按 enter。

我还尝试了TASKKILL /FI 开关的多种变体:

TASKKILL /fi IMAGENAME ne cmd.exe /im explorer.exe /f /t`
TASKKILL /fi USERNAME eq [name] /fi WINDOWTITLE ne Options.bat /im explorer.exe /f /t

我认为这会结束所有“不等于” cmd.exe/Options.bat 的进程,但我无法让它工作。

问题:有没有办法在 TK.bat 中执行TASKKILL /im explorer.exe /f /t,不会关闭当前正在运行的批处理文件,而无需从任务管理器中运行它?也许是一个不同的命令或赋予 Options.bat 某种提升的权限,以阻止它在 Explorer.exe /t 结束时被关闭。理想情况下,无需安装单独的 3rd 方工具?

我知道我可以编辑批处理文件以结束 explorer.exe,结束每个关联的 .exe,然后单独停止我不需要的服务,但这很耗时,而且没有意义编写文件以使其自动化和可转移(如果需要)。

任何帮助将不胜感激,如果有帮助,我可以上传两个批处理文件的完整代码。

【问题讨论】:

【参考方案1】:

为了防止taskkill /im explorer.exe /f /t 杀死正在执行批处理文件的cmd 实例,您需要打破cmd.exeexplorer.exe 的特定实例之间的父子关系。

诀窍是使用嵌套cmds 的两个额外实例。第一个启动第二个并立即终止,因此第二个实例成为无法确定为exeplorer.exe 的后代的孤立进程。此时第二个实例可以安全执行taskkill /im explorer.exe /f /t

start "Chain breaker" /min cmd /d /c start "Orphaned Process" cmd /d /c Options.bat

以上内容可以从命令提示符或其他批处理文件中使用。

您也可以将此技术直接合并到Options.bat 文件中,但Options.bat 需要额外的逻辑来确定何时在嵌套的cmd 中启动自身以及何时执行实际代码。

演示该概念的示例脚本如下:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "tokens=3 delims=:" %%L in ("%~0") do goto %%L

REM Reinvoke the batch file forcing it to jump to the :main label
start "Chain breaker" /min cmd /d /c start "Orphaned Process" cmd /d /c @"%~d0\:main:\..%~pnx0"
exit /b

:main
taskkill /im explorer.exe /f /t
echo I'm alive
pause
exit /b

【讨论】:

【参考方案2】:

奇怪的是,简单的 taskkill /F /IM explorer.exe & start explorer 命令可以完成这项任务。我不知道为什么,但它确实有效。

【讨论】:

它似乎有效,但实际上并没有。当您执行taskkill /F /IM explorer.exe & start explorer 时,所有exeplorer.exe 的子进程将保持活动状态并且新创建的exeplorer.exe 进程将不是这些进程的父进程,因此现在发出taskkill /im explorer.exe /f /t 不会杀死它们。它违背了 OP 问题的目的,即它与 exeplorer.exe 一起杀死子进程,但保留正在运行批处理文件的进程。

以上是关于如何在使用 TASKKILL /f /t /im explorer.exe 时保持批处理文件运行?的主要内容,如果未能解决你的问题,请参考以下文章

CMD /im (taskkill) 是啥?

cmd如何自动查杀指定进程?用tasklist+find找出指定进程,怎么继续。

笔记端口被占用如何解决

dos 与 进程

cmd下命令提示符下杀进程主要有三种方法

如何解决Windows的端口占用问题?