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

3

我在寻找一段脚本,根据任务管理器中的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%

我在命令行中使用关键字来识别PID。但是当我执行这个脚本时,我得到了错误的PID。我猜测它返回的是脚本的PID,因为脚本也可能包含关键字。在执行脚本时,参数被视为关键字。


"任务管理器的命令行数值"是什么? - SomeDude
我已经编辑了我的帖子。它包含了答案。 - Master_Roshy
еҸҜиғҪжңүжӣҙеӨҡзҡ„иҝӣзЁӢдҪҝз”ЁзӣёеҗҢзҡ„е‘Ҫд»ӨиЎҢгҖӮе°қиҜ•дҪҝз”Ёecho %%$иҖҢдёҚжҳҜset %%$жқҘжҹҘзңӢжңүеӨҡе°‘иҝӣзЁӢе°Ҷеә”з”ЁwmicжҹҘиҜўгҖӮ - npocmaka
我看到了两组值。一组以“Caption=java.exe”开头,另一组以“Caption=WMIC.exe”开头。因此它返回的是wmic.exe pid。有没有办法获取另一个值的pid? - Master_Roshy
@Master_Roshy,请检查我的编辑(在答案中)。 - npocmaka
2个回答

4

WMIC PROCESS 是你需要的。虽然你需要一些技巧才能从批处理中使用它。我使用了更复杂的命令行,其中包含引号、括号、空格和文件分隔符... 你需要改变它并设置你想要的值。

首先,你需要在命令行中每个反斜杠都加倍(我的意思是脚本应该这样做)。引号也可能是一个问题,需要用 % 替换或用 \" 转义(WMIC 使用 SQL 命令的子集 WQL% 用作通配符)。还有一件事是你需要用 FOR 循环两次处理结果以去除不需要的特殊字符/Format:Value 可以用于直接声明变量/值对。所以在这里:

@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
 wmic process where name='explorer.exe' get commandline, pid /format:list

是一种方法。还可以查看tasklist /v


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接