windows机器上的Java程序如何在不使用JNA的情况下获得给定进程的PID

windows机器上的Java程序如何在不使用JNA的情况下获得给定进程的PID,windows,jna,pid,Windows,Jna,Pid,我想使用以下命令行终止Windows中的特定Java进程: taskkill /f /pid <my_pid> 最后我找到了解决办法。 我使用了wmic process get命令行、processidwindows命令来获取PID 以下是我的Killer.java: import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; public class K

我想使用以下命令行终止Windows中的特定Java进程:

taskkill /f /pid <my_pid>

最后我找到了解决办法。 我使用了
wmic process get命令行、processid
windows命令来获取PID

以下是我的Killer.java:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Killer {


public static void main(String[] args) throws Exception {



    ArrayList<String> cmds = new ArrayList<String>();

    cmds.add("wmic");
    cmds.add("process");
    cmds.add("get");
    cmds.add("commandline,processid");

    ProcessBuilder pb = new ProcessBuilder(cmds);

    Process p = pb.start();

    //p.waitFor();


    BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()));

    String line;
    int pid=0;

    while((line = rd.readLine()) != null)
    {
        if(line.contains(args[0]) && !line.contains("Killer"))
        {

            System.out.println("OK" + line);
            String[] split = line.split(" ");
            pid=Integer.parseInt(split[split.length - 1]);

        }
        else
        {
            //System.out.println("  " + line);
        }
    }

    cmds = new ArrayList<String>();

    System.out.println("Kill pid " + pid);
    cmds.add("taskkill");
    cmds.add("/T");
    cmds.add("/F");
    cmds.add("/PID");
    cmds.add("" + pid);
    pb = new ProcessBuilder(cmds);
    pb.start();
 }               
}
导入java.io.BufferedReader;
导入java.io.InputStreamReader;
导入java.util.ArrayList;
公众阶级杀手{
公共静态void main(字符串[]args)引发异常{
ArrayList cmds=新建ArrayList();
cmds.add(“wmic”);
cmds.add(“流程”);
cmds.add(“get”);
添加(“命令行,进程ID”);
ProcessBuilder pb=新的ProcessBuilder(cmds);
进程p=pb.start();
//p、 waitFor();
BufferedReader rd=新的BufferedReader(新的InputStreamReader(p.getInputStream());
弦线;
int-pid=0;
而((line=rd.readLine())!=null)
{
if(line.contains(args[0])&&!line.contains(“Killer”))
{
System.out.println(“OK”+行);
String[]split=line.split(“”);
pid=Integer.parseInt(split[split.length-1]);
}
其他的
{
//系统输出打印项次(“+行);
}
}
cmds=new ArrayList();
System.out.println(“Kill pid”+pid);
cmds.add(“taskkill”);
cmds.add(“/T”);
cmds.add(“/F”);
cmds.add(“/PID”);
添加(“+pid”);
pb=新的ProcessBuilder(cmds);
pb.start();
}               
}

希望它能对您有所帮助。

正如您所发现的,您可以通过命令行
wmic
使用WMI,但也可以


过滤输出需要几个开关。

另请参见,但您如何知道必须从列表中删除哪个进程?与WMI相同,您可以通过ImageName(程序,如
tasklist.exe
)或其他字段进行搜索。我在您的原始帖子的评论中发布了一个具体的示例,其中显示了语法。虽然
tasklist
只列出它,但您可以使用类似的语法(稍微不同的开关)直接使用
taskkill
命令进行过滤。如果匹配其他字段,甚至不必匹配PID。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Killer {


public static void main(String[] args) throws Exception {



    ArrayList<String> cmds = new ArrayList<String>();

    cmds.add("wmic");
    cmds.add("process");
    cmds.add("get");
    cmds.add("commandline,processid");

    ProcessBuilder pb = new ProcessBuilder(cmds);

    Process p = pb.start();

    //p.waitFor();


    BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()));

    String line;
    int pid=0;

    while((line = rd.readLine()) != null)
    {
        if(line.contains(args[0]) && !line.contains("Killer"))
        {

            System.out.println("OK" + line);
            String[] split = line.split(" ");
            pid=Integer.parseInt(split[split.length - 1]);

        }
        else
        {
            //System.out.println("  " + line);
        }
    }

    cmds = new ArrayList<String>();

    System.out.println("Kill pid " + pid);
    cmds.add("taskkill");
    cmds.add("/T");
    cmds.add("/F");
    cmds.add("/PID");
    cmds.add("" + pid);
    pb = new ProcessBuilder(cmds);
    pb.start();
 }               
}