批量杀死除非必需和cmd之外的所有进程

时间:2015-02-18 17:33:30

标签: batch-file process batch-processing

我正在尝试创建一个批处理文件,其中一部分结束了除cmd和chrome之外的所有必要进程。到目前为止我有:

cd c:\windows\System32
for /f "skip=3 tokens=1" %%i in ('TASKLIST /FI "USERNAME eq %userdomain%\%username%" /FI "STATUS eq running"') do (
if not "%%i"=="cmd.exe" (
if not "%%i"=="C:\Windows\system32\cmd.exe" (
if not "%%i"=="svchost.exe" (
if not "%%i"=="tasklist.exe" (
if not "%%i"=="fun.bat" (
if not "%%i"=="mine.vbs" (
if not "%%i"=="chrome.exe" (
taskkill /f /im "%%i" 
))))))))

(取自http://agnipulse.com/2009/02/kill-all-running-apps-with-a-double-click/然后稍微编辑)

除了if not "%%i"=="cmd.exe" (之外,所有这些都有效 由于某种原因终端退出即使它不应该退出。 任何人都可以说为什么以及如何解决它或以不同的方式结束所有非必要的过程?

编辑:此外,如果我添加一个pause到最后它永远不会达到,所以我现在认为它的程序在它完成其余的程序之前杀死它自己的进程,即使{{1} }在例外列表中。有人认为这可能是问题以及如何解决这个问题的想法吗?

2 个答案:

答案 0 :(得分:2)

我怀疑您的问题的答案是终端退出是因为您双击批处理文件。无论您是否想要,这都是预期的行为。与双击(在注册表中定义)相关联的操作通常为cmd /c script.bat/c开关运行命令然后退出。如果要在杀死所有其他任务后保持双击激活的控制台处于活动状态,请在末尾添加pause,或者在脚本顶部添加cmd /k的包装器,像这样:

set "caller=%cmdcmdline:"=%"
if /I "%caller:~0,6%"=="cmd /c" (
    cmd /k "%~f0"
    goto :EOF
)

我也看到了其他一些问题。您正在搜索任务列表中的.bat脚本和.vbs文件。那些不是可执行文件。解析它们的过程将分别为cmd.execscript.exe

我建议采用不同的方向。你会怎么想,而不是将可执行文件列入白名单,而是将发布者列入白名单?在这个例子中,我将Microsoft,Mozilla,Kingsoft(我的病毒扫描程序),Nvidia(音频,视频,局域网等驱动程序助手)和Google列入白名单;并杀死其他出版商的过程。

@echo off
setlocal

set "whitelist=Microsoft Google Mozilla Kingsoft Nvidia"

for /f "tokens=2 delims=," %%I in (
    'wmic process get executablepath^,status /format:csv ^| find "\"'
) do (
    set "proc=%%~I"
    setlocal enabledelayedexpansion 
    set /p "=%%~I: "<NUL
    wmic datafile where "name='!proc:\=\\!'" get manufacturer | findstr /i "%whitelist%" >NUL && (
        echo OK
    ) || (
        echo UNACCEPTABLE!
        taskkill /im "%%~nxI" /f
    )
    endlocal
)

这样,您可能已经忘记包含的任何关键进程(例如explorer.exe)都不会被杀死,因为它们已由Microsoft发布。

答案 1 :(得分:0)

你不想杀死conhost.exe。它托管shell。在linux上,conhost是bash,而cmd是gnome-terminal。所以也要排除conhost。此外,如果您将此内容提供给没有英文QWERTY键盘布局的人,请添加ctfmon.exe。