1

Я хочу убить все процессы с помощью taskkill по имени пользователя, с помощью этой команды:

taskkill /f /fi "USERNAME eq %username%"

Проблема в том, что я хочу исключить (пропустить) некоторые процессы (не уничтожать их все), такие как explorer.exe, taskmgr.exe, cmd.exe и, конечно, текущий экземпляр CMD

Как я могу исключить эти процессы с помощью Taskkill?

Спасибо

3 ответа3

2

Метод CMD для родного сценария Windows

Ниже приведено решение для пакетного сценария, в котором используются переменные Tasklist и циклы FOR /F и разбор переменных соответственно, чтобы получить только имена процессов, выполняемых конкретным пользователем.

С Findstr эти результаты затем анализируются, чтобы исключить любые указанные исключения, которые вы установили в верхней части переменной Exclusions .

Он возьмет окончательные оставшиеся результаты и уничтожит эти имена процессов для этого конкретного имени пользователя, давая вам желаемые результаты с помощью пакетного сценария, как объяснено.

Пакетный скрипт

Для этого нужно установить только две переменные: Username и Exclusions , а остальные будут работать и выполнять оставшуюся часть процесса по мере необходимости. Просто укажите полные имена процессов, разделенные пробелом один рядом с другим, как в приведенном ниже сценарии.

@ECHO ON
SET Username=user
SET Exclusions=explorer.exe taskmgr.exe cmd.exe 

SET tmpfl=%temp%\%~n0tmp.dat
IF EXIST "%tmpfl%" DEL /F /Q "%tmpfl%"
SET Exclusions=%Exclusions% taskkill.exe 

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "DELIMS=: TOKENS=2" %%A IN ('TASKLIST /FI "USERNAME EQ %Username%" /FO LIST ^| FIND /I "Image name:"') DO (
    SET var=%%~A
    SET var=!var: =!
    ECHO !var! | FINDSTR /I /V "%Exclusions%">>"%tmpfl%"
)
FOR /F "USEBACKQ TOKENS=*" %%A IN ("%tmpfl%") DO (
    TASKKILL /F /FI "USERNAME eq %Username%" /IM %%~A
)
GOTO :EOF

Пакетный скрипт 2

@ECHO ON
CD /D "%~DP0"
SET Exclusions=cmd.exe explorer.exe taskmgr.exe 

SET tmpfl=%~n0tmp.dat
IF EXIST "%tmpfl%" DEL /F /Q "%tmpfl%"
SET Exclusions=%Exclusions% taskkill.exe 

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "DELIMS=: TOKENS=2" %%A IN ('TASKLIST /FI "USERNAME EQ %Username%" /FO LIST ^| FIND /I "Image name:"') DO (
    SET var=%%~A
    SET var=!var: =!
    ECHO !var! | FINDSTR /I /V "%Exclusions%">>"%tmpfl%"
)
FOR /F "USEBACKQ TOKENS=*" %%A IN ("%tmpfl%") DO (
    TASKKILL /F /FI "USERNAME eq %Username%" /IM %%~A
)
DEL /F /Q "%tmpfl%"
GOTO :EOF

Дополнительные ресурсы

2

Я бы лично сделал это с помощью powershell.

Что-то вроде этого:

$processes = Get-Process -IncludeUserName | where {$_.UserName -like "*USERNAME*"}
$tobeignored = @("explorer","Taskmgr","cmd")
foreach($process in $processes)
{
    if($tobeignored.Contains($process.ProcessName))
    {
        continue;
    }
    else
    {
        Stop-Process $process.Id -Force
    }
}

Я не был в состоянии проверить это, я вроде не хочу убивать свои собственные процессы :) Дайте мне знать, если это не работает (ы)

0

Вы можете сделать это, указав несколько фильтров для taskkill . Например, если вы хотите исключить explorer.exe, добавьте фильтр для имени образа, не равного explorer.exe (с оператором ne ):

taskkill /f /fi "USERNAME eq %username%" /fi "IMAGENAME ne explorer.exe"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .