[英]How to keep batch file running whilst using TASKKILL /f /t /im explorer.exe?
简而言之,我需要启动1.bat
,它可以CALL
或START
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.