如何在使用 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
,可以CALL
或START
2.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.exe
和explorer.exe
的特定实例之间的父子关系。
诀窍是使用嵌套cmd
s 的两个额外实例。第一个启动第二个并立即终止,因此第二个实例成为无法确定为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 时保持批处理文件运行?的主要内容,如果未能解决你的问题,请参考以下文章