Как найти pid процесса с помощью wmic и убить его с помощью taskkill

Мне нужно найти PID процесса с помощью команды WMIC, а затем убить этот процесс с помощью taskkill. Я почти добился этого, но единственная проблема заключается в том, что в конце переменной PID есть новая строка. Пока я сделал это:

c:\patryk>for /F "skip=1 tokens=*" %a in ('wmic process where "CommandLine like '%sourceprocessor%' and name like '%java%'" get ProcessId') do taskkill /pid | set /p pid=%a

Итак, это циклический вывод wmic, который содержит 3 строки: заголовок (ProcessId), найденный PID (число) и пустая строка. Я пропускаю первую строку, потому что это просто заголовок. Теперь я хочу убить процесс с pid, найденным во второй строке. И есть проблема, что в конце строки есть знак новой строки, поэтому вся команда не работает. Может ли кто-нибудь дать мне несколько советов, как я могу этого добиться? Как я могу удалить этот знак новой строки?


person Patryk S    schedule 02.09.2014    source источник


Ответы (2)


for /F "skip=2 tokens=2 delims=," %a in (
  'wmic process where " .... " get ProcessID^,Status /format:csv'
) do taskkill /pid %a

Теперь у вас есть вывод из wmic с дополнительной строкой в ​​начале (отсюда пропуск), с полями, разделенными запятыми (разделитель), и включенными тремя полями: узел (имя компьютера), который добавляется автоматически, идентификатор процесса (идентификатор процесса). второй токен) и конечное поле статуса, которое не будет использоваться, но позволит нам получить второй токен в строке без завершающего CR

Или вы можете добавить дополнительную команду for в исходную строку.

for /f ... %a in ( ... ) do for %b in (%a) do taskkil /pid %b

Этот дополнительный цикл for удалит символ CR из извлеченных данных wmic, которые находятся в %a.

person MC ND    schedule 02.09.2014
comment
Спасибо за ваш ответ. Это решение работает, но я нашел что-то проще. Когда мы искали такой сложный способ убить процесс, оказалось, что это довольно просто: wmic process where "CommandLine like '%sourceprocessor%' and name like '%java%'" call terminate делает дело :) - person Patryk S; 02.09.2014
comment
@PatrykS, всего одно замечание. taskkill (без /f) отправляет сообщение wm_close целевому процессу с просьбой закрыть его. wmi Terminate метод не такой щадящий и прямо убивает процесс. Если нет риска потери данных, это не имеет значения, в противном случае лучше начать с taskkill, а если через некоторое время процесс все еще выполняется, то используйте taskkill /f или wmi terminate, чтобы гарантировать завершение процесса. - person MC ND; 02.09.2014
comment
спасибо за совет, я в курсе. К счастью, нет риска потери данных, и процесс можно прервать. - person Patryk S; 02.09.2014

У меня была аналогичная проблема, когда мне приходилось останавливать задачу, зная только имя запущенного файла. Решение было:

for /f "tokens=2 delims=," %%a in (
    'wmic service get name^,pathname^,state /format:csv ^| findstr /i /r /c:"SomeServer\.exe.*Running$"'
) do sc stop "%%a"

Это остановит процесс по имени. Может быть, вы можете использовать имя файла вместо PID?!?

person MichaelS    schedule 02.09.2014
comment
Извините, только что заметил, что речь идет о процессах, а не о службах. Это все еще может помочь, поэтому я не буду его удалять. - person MichaelS; 02.09.2014