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

1

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

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

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

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

Спасибо

BrianC
источник
Всем привет. Мы не являемся сервисом по написанию сценариев, поэтому, поскольку вы указали, что пытаетесь решить эту проблему с помощью пакетного сценария, пожалуйста, укажите, что вы уже пробовали, каковы были результаты и что вас точно запутало. Если это НЕ ДОЛЖНО быть в пакетном режиме и / или при использовании taskkill, отредактируйте свой вопрос, чтобы удалить тег пакетного режима, чтобы увеличить ваши шансы на получение ответов (которые могут основываться или не основываться на пакетном режиме). :)
Ƭᴇcʜιᴇ007
вопрос очень ясный и точный
BrianC
Брайан - см. Ниже в моем ответе проверенный и подтвержденный рабочий процесс из того, что я проверял и мог подтвердить, что он работает, как ожидалось. Дайте мне знать, как это происходит.
Сок Pimp IT

Ответы:

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

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

Сок Pimp IT
источник
Пожалуйста, проверьте скрипт на наличие ошибок. Системе не удается найти файл C: \ Users \ user1 \ AppData \ Local \ Temp \ testtmp.dat. Кстати. эта переменная нежизнеспособна (SET Username = user), потому что она должна обслуживать любую учетную запись. Его необходимо заменить на% username%
BrianC
Эта переменная (SET Username = user) не нужна. Только "USERNAME EQ% username%"
BrianC
Да. И изменение только в пользовательском журнале
BrianC
Я запустил скрипт с правами администратора на аккаунте и такой же ошибкой (win7x64)
BrianC
замените% temp% на% HOMEDRIVE%
BrianC
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
    }
}

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

Kage
источник
Хорошо проверил это, и сделал небольшое изменение :), это делает трюк. Просто добавьте имена процессов (без расширения) в массив, те, которые вы хотите оставить в покое
Kage
извини, я ничего не знаю о powershell. Мне нужны решения с cmd-taskkill. В любом случае, спасибо
BrianC
Ваша потеря :) Powershell - мощный инструмент для написания сценариев, он может сделать с ним гораздо больше, чем с cmd, все более поздние (windows) ОС поставляются с ним по умолчанию
Kage
Да, я знаю. Я очень ценю вашу помощь
BrianC
0

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

taskkill /f /fi "USERNAME eq %username%" /fi "IMAGENAME ne explorer.exe"
Оуэн Полинг
источник