java windows 执行cmd命令后返回这个cmd命令的进程id
时间: 2024-04-22 08:24:20 浏览: 122
要在Java中执行Windows的cmd命令并返回该命令的进程ID,您可以使用`Process`类和`ProcessBuilder`类来实现。下面是一个示例代码:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CmdExecutionWithProcessBuilderExample {
public static void main(String[] args) {
try {
// 创建ProcessBuilder对象
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "echo Hello World");
// 启动进程
Process process = processBuilder.start();
// 获取进程ID
long pid = getProcessId(process);
System.out.println("进程ID:" + pid);
// 等待命令执行完毕
process.waitFor();
System.out.println("命令执行完毕!");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
private static long getProcessId(Process process) {
long pid = -1;
try {
// 获取Process对象内部的pid字段
if (process.getClass().getName().equals("java.lang.Win32Process") ||
process.getClass().getName().equals("java.lang.ProcessImpl")) {
java.lang.reflect.Field field = process.getClass().getDeclaredField("handle");
field.setAccessible(true);
long handle = field.getLong(process);
// 调用Windows API获取进程ID
Kernel32 kernel = Kernel32.INSTANCE;
WinNT.HANDLE winHandle = new WinNT.HANDLE();
winHandle.setPointer(Pointer.createConstant(handle));
pid = kernel.GetProcessId(winHandle);
}
} catch (Exception e) {
e.printStackTrace();
}
return pid;
}
}
// 定义内部类和接口以获取进程ID
interface Kernel32 extends com.sun.jna.Library {
Kernel32 INSTANCE = com.sun.jna.Native.load("kernel32", Kernel32.class);
int GetProcessId(WinNT.HANDLE Process);
}
interface WinNT extends com.sun.jna.win32.StdCallLibrary {
interface HANDLE extends com.sun.jna.PointerType {
}
}
```
在上面的示例中,我们使用`ProcessBuilder`类创建一个cmd命令的进程,并使用`start()`方法启动该进程。然后,我们通过调用`getProcessId()`方法获取该进程的ID。
`getProcessId()`方法使用Java Native Access (JNA)库来调用Windows API,从`Process`对象中获取进程的句柄,并通过句柄获取进程ID。
请注意,上述代码需要依赖JNA库,您需要在项目中引入JNA库的相关依赖。此外,根据您执行的具体命令和环境,可能需要进行额外的适配和测试。
阅读全文