как получить PID из командной строки, отфильтрованные по имени пользователя и имени пользователя - PullRequest
4 голосов
/ 08 декабря 2011

Мне нужно иметь возможность получить PID из запущенного процесса (cmd.exe) с помощью командной строки. Проблема в том, что запущены два cmd.exe. Один находится под именем пользователя SYSTEM, а другой - compUser. Есть ли способ, которым я могу получить PID compUser cmd.exe?

Редактировать: это требует дальнейшего объяснения. Я делаю это из командного файла. Один из вызовов, которые я делаю в моем пакетном файле, запускает cmd.exe, который никогда не умирает. Так что убить этот cmd.exe было бы просто:

taskkill /F /IM cmd.exe /FI "username eq compUser"

Проблема в том, что пакетный файл, в котором я нахожусь, обрабатывается другим экземпляром cmd.exe под именем пользователя compUser. То, что я пытаюсь сделать, это получить PID из оригинального cmd.exe, прежде чем я запустите второй cmd.exe. Таким образом, я могу просто использовать команду:

taskkill /F /IM cmd.exe /FI "username eq compUser" /FI "PID neq [orignal task's PID]"

Ответы [ 4 ]

4 голосов
/ 09 декабря 2011

В итоге мне пришлось использовать это:

TASKLIST /NH /FI  "IMAGENAME eq cmd.exe" /FI "username eq compUser"> psid.txt
FOR /F "tokens=2" %%I in (psid.txt ) DO set pIdNotToKill=%%I

прямо перед запуском пакетного скрипта, который зависает.Затем, когда я был готов убить висящее окно cmd:

taskkill /F /IM cmd.exe /FI "PID ne %pIdNotToKill%" /FI "username eq compUser"

Возможно, есть лучший способ, но это сработало.

3 голосов
/ 13 июля 2015

Я устанавливаю заголовок для своего собственного окна cmd, другие окна cmd, которые я называю или запускаю с помощью «start / b», я переименовываю в другое название заголовка окна. Затем я определяю PID, устанавливаю MYPID и уничтожаю все другие cmd с помощью ДРУГОГО PID моего.

Все в одном файле, работающем в другом цикле меток с тайм-аутом.

@(@Title TitleOfMyScript)
for /f "tokens=2" %%a in ('tasklist /fi "imagename eq cmd.exe" /fi "windowtitle eq TitleOfMyScript" /nh') do set MYPID=%%a
taskkill /FI "PID ne %MYPID%" /FI "IMAGENAME eq cmd.exe" /F
3 голосов
/ 08 декабря 2011

Это отобразит все процессы с именем «cmd.exe» для пользователя «compUser»:

tasklist /FI "IMAGENAME eq cmd.exe" /FI "USERNAME eq compUser"
1 голос
/ 02 сентября 2013

Я хотел бы просто поделиться своим фрагментом кода, может быть, он кому-нибудь пригодится. Он основан на комментарии от jiggawagga, но может прервать многие процессы:

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION

REM kill old server process
SET pIdNotToKill=
SET pIdFilter=

FOR /F "tokens=2" %%I IN (%SERVER_HOME%\psid.txt) DO (
    IF NOT "%%I"=="No" (
        SET pIdNotToKill=!pIdNotToKill! %%I
        SET pIdFilter=!pIdFilter! /FI "PID ne %%I"
    )
)

IF NOT "!pIdNotToKill!"=="" (
    ECHO Killing all Java processes except%pIdNotToKill%
    ECHO TASKKILL command will be called with the filter%pIdFilter%
    TASKKILL /F /IM java.exe %pIdFilter%
)

DEL %SERVER_HOME%\psid.txt

TASKLIST /NH /FI "IMAGENAME eq java.exe" > %SERVER_HOME%\psid.txt

прямо перед запуском серверного процесса.

...