繁体   English   中英

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

[英]How to keep batch file running whilst using TASKKILL /f /t /im explorer.exe?

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

完整说明:
我有几台运行 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 Explorer(甚至“以管理员身份运行”)运行 Options.bat 并调用 TK.bat 脚本运行TASKKILL /im explorer.exe /f /t它确实有效,但也关闭了 CMD window,当我希望它返回到选项选择。 当我为 TASKKILL 使用“树”属性时,这确实有意义。

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

我在 Options.bat 中尝试了RUNAS命令 -

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

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

我还尝试了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 ,结束每个 associated.exe 然后停止我不需要的服务,单独的,但这是耗时的,并且破坏了编写文件以使其自动化和可传输的意义(如果需要的话)。

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

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

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

诀窍是使用嵌套的cmd的两个额外实例。 第一个启动第二个并立即终止,因此第二个实例成为一个孤立的进程,无法确定为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM