2016-02-08 4 views
3

Я искал сценарий для получения PID процесса Java на основе значения CommandLine диспетчера задач. ALl эти java-процессы имеют аналогичное значение COmmandLine, но отличаются ключевым словом в CommandLine. Этот процесс не может быть идентифицирован по имени изображения, потому что все они имеют один и тот же java.exe. Есть ли способ? Я поместил ниже код на основе ответа npocmaka вПолучение pid процесса на сервере windows

@echo off 
setlocal enableDelayedExpansion 

set "command_line="%1"" 

set "command_line=!command_line:"=%%!" 

echo ~~!command_line!~~ 

for /f "usebackq tokens=* delims=" %%# in (
    `wmic process where 'CommandLine like "%command_line%"' get /format:value` 
) do (
    for /f %%$ in ("%%#") do (
     set "%%$" 
    ) 
) 

echo %ProcessId% 

Я использую ключевое слово в CommandLine для идентификации PID. Но когда я выполняю этот скрипт, я получаю неправильный PID. Я предполагаю, что он возвращает сценарии PID, так как скрипт также может содержать ключевое слово. Аргумент при выполнении сценария принимается за ключевое слово

+0

Что такое «CommandLine значения диспетчера задач»? – SomeDude

+0

Я редактировал свой пост. Он содержит ответ –

+0

, вероятно, есть больше процессов с одной и той же командной строкой. Попробуйте использовать 'echo %% $' вместо' set %% $ ', чтобы увидеть, сколько процессов будет применять wmic-запрос, – npocmaka

ответ

4

WMIC PROCESS - это то, что вам нужно. Хотя вам понадобятся некоторые трюки, чтобы использовать его из пакета. Я использовал более сложную командную строку, содержащую кавычки, скобки, пробелы, разделители файлов .... Вам нужно будет измените его и установите требуемое значение.

Сначала вам нужно удвоить каждый обратный слеш в командной строке (сценарий должен сделать это, я имею в виду) .Quotes также может быть проблемой, и должен быть заменен % или отделался \" (WMIC использует WQL в subset ofSQL и % используются в качестве подстановочных знаков). Другое дело, что вам нужно обработать результат дважды с помощью FORloop to rid-off unwanted special characters. /Format:Value может быть использован для прямого объявляющего переменного/значения pairs.So здесь:

@echo off 
setlocal enableDelayedExpansion 

:: !!!!!!!!! 
set "command_line="C:\Program Files (x86)\Dropbox\Client\Dropbox.exe" /systemstartup" 
:: !!!!!!!! 

set "command_line=!command_line:\=\\!" 
set "command_line=!command_line:"=%%!" 
::or 
::set "command_line=!command_line:"=\"!" 


rem echo ~~!command_line!~~ 

for /f "usebackq tokens=* delims=" %%# in (
    `wmic process where 'CommandLine^="!command_line!"' get /format:value` 
) do (
    for /f %%$ in ("%%#") do (
     set "%%$" 
    ) 
) 

echo %ProcessId% 
+0

См. Мой отредактированный пост –

0
wmic process where name='explorer.exe' get commandline, pid /format:list 

- один из способов. Также см. tasklist /v.