在 windows 服务器中获取进程的 pid

getting pid of process in windows server

我正在寻找一个脚本来根据任务管理器的 CommandLine 值获取 java 进程的 PID。所有这些 java 进程都具有相似的 COMmandLine 值,但在 CommandLine 中的关键字不同。无法通过图像名称识别进程,因为它们都具有相同的 java.exe。有办法吗?我根据 npocmaka 的回答在下面放置了代码

@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,因为脚本也可能包含关键字。执行脚本时的参数作为关键字

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

是一种方式。另见 tasklist /v.

WMIC PROCESS 就是你 need.Though 你需要一些技巧才能使用它 batch.I 使用了更复杂的命令行,其中包含引号、括号、空格、文件分隔符....您需要更改它并设置您想要的值。

首先,您需要将命令行中的每个反斜杠加倍(我的意思是脚本应该这样做)。引号也可能是个问题,需要用 % 替换或用 [= 转义13=] (WMIC 使用 WQL a subset of SQL commands and % is used as wildcard).Another thing is you need to process the result twice with FOR loop to rid-off unwanted special characters./Format:Value 可以用来直接声明 variable/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%