Java执行wmic命令获取系统环境变量

本文介绍如何通过批处理文件设置Windows系统的环境变量,并提供了一个Java程序示例来读取这些变量。具体步骤包括创建setenv.bat文件来定义新的系统变量及使用WMICJava程序读取变量值。

1.首先编写文件setenv.bat设置系统环境变量:

echo %cd%
set framework_home=%cd%
echo %framework_home%
wmic ENVIRONMENT create name="framework_home",username="<system>",VariableValue="%framework_home%"

Note:

此处假设framework_home为要添加的系统环境变量,且其值为当前路径。Windows系统有两种环境变量:用户变量和系统变量。上面设置的是系统变量。

2.编写Java程序读取上面设置的系统环境变量:

package test.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

class StreamDrainerThread implements Runnable
{
	private InputStream ins;

	public static String environmentValue;

	public StreamDrainerThread(InputStream ins)
	{
		this.ins = ins;
	}

	public void run()
	{
		try
		{
			BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
			String line = null;
			while ((line = reader.readLine()) != null)
			{
				if (!line.trim().equals(""))
				{
					environmentValue = line;
				}
			}
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}

}

public class WMICJava
{
	public static void main(String[] args) throws IOException
	{
		String[] cmd = new String[]
		{ "cmd.exe", "/C", "wmic ENVIRONMENT where \"name=\'framework_home\'\" get VariableValue" };
		try
		{
			Process process = Runtime.getRuntime().exec(cmd);
			StreamDrainerThread streamDrainer = new StreamDrainerThread(process.getInputStream());
			new Thread(streamDrainer).start();
			process.getOutputStream().close();
			process.waitFor();
			System.out.println("Environment Parameter OATS_HOME is " + StreamDrainerThread.environmentValue);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

参考:

【1】java Runtime 执行 windows wmic 命令
http://hi.baidu.com/kelongxhu/blog/item/7ed96dfb028c9b354f4aeab1.html

<think>我们被要求提供一个在Windows系统下查找Java进程的命令。 在Windows中,常用的命令有: 1. 使用任务管理器(图形界面)可以查看,但命令行更高效。 2. 使用`tasklist`命令,可以配合过滤。 3. 使用`jps`(Java Virtual Machine Process Status Tool)命令,这是JDK自带的工具。 但是注意:`jps`命令需要JDK的bin目录在环境变量PATH中。 因此,我们提供两种方法: 方法一:使用`jps`命令(推荐,因为可以显示主类名) 打开命令提示符(cmd)并输入: jps -l 这个命令会列出所有Java进程的PID(进程ID)和完整的主类名。 方法二:使用`tasklist`命令(当没有JDK环境时) tasklist /FI "IMAGENAME eq java.exe" 这个命令会列出所有名为java.exe的进程,并显示进程ID、会话名、会话#、内存使用等信息。 但是,有时候Java进程可能是javaw.exe(例如,一些GUI应用),所以也可以同时查找javaw.exe: tasklist /FI "IMAGENAME eq java.exe" /FI "IMAGENAME eq javaw.exe" 不过,`tasklist`的多个过滤条件默认是“或”的关系?实际上,`tasklist`的多个/FI是“与”的关系,所以上面这样写是错误的。正确的做法是分别查询,或者使用通配符: tasklist /FI "IMAGENAME eq java.exe" tasklist /FI "IMAGENAME eq javaw.exe" 或者使用通配符(注意:tasklist不支持通配符在中间,所以不能使用`java*.exe`,但可以分别查询) 另外,也可以使用`wmic`命令wmic process where "name='java.exe' or name='javaw.exe'" get processid,commandline 这个命令可以显示进程ID和命令行,可以更清楚地看到启动参数。 因此,我们总结如下: 1. 如果安装了JDK且配置了环境变量,使用: jps -l 2. 如果没有JDK环境,使用: tasklist | findstr "java javaw" 或者更精确的: tasklist /FI "IMAGENAME eq java.exe" tasklist /FI "IMAGENAME eq javaw.exe" 3. 如果需要详细信息(如命令行参数),使用: wmic process where "name='java.exe' or name='javaw.exe'" get processid,commandline 但是,由于问题要求的是“查找Java进程”的命令,我们给出最常用的两种。 注意:在PowerShell中,命令略有不同,但问题要求的是Windows命令,通常指cmd命令。 因此,我们回答: 在Windows中查找Java进程的命令: 1. 使用JDK自带的jps命令:`jps -l` 2. 使用系统自带的tasklist命令:`tasklist /FI "IMAGENAME eq java.exe"` 和 `tasklist /FI "IMAGENAME eq javaw.exe"` 解释: - `jps -l`:显示所有Java进程的PID和主类的完整包名。 - `tasklist`命令:通过筛选映像名称为java.exe或javaw.exe的进程来查找Java进程。 另外,如果使用PowerShell,可以使用: Get-Process java, javaw 但题目要求的是命令,所以我们给出cmd下的命令。 代码示例(如果需要用Java代码执行这些命令): 虽然问题没有要求代码,但我们可以给出在Java程序中执行这些命令的代码片段。 但是注意:问题要求提供的代码只能是Java代码。所以我们可以给出一个在Java程序中执行系统命令来查找Java进程的示例。 但是,在Java中,我们也可以使用`ManagementFactory`来获取当前JVM的进程ID,或者使用`ProcessHandle`(Java 9+)来获取进程信息,但无法直接获取所有Java进程。 因此,如果需要在Java程序中获取所有Java进程,可以调用操作系统的命令并解析输出。 示例代码(使用jps命令):</think>### Windows 下查找 Java 进程的完整命令指南 #### 核心命令解析 在 Windows 系统中,查找 Java 进程主要通过以下命令实现: 1. **使用 `jps` 命令(JDK 自带工具)** 这是最直接的方法,但需要 JDK 的 bin 目录在系统 PATH 中: ```cmd jps -l -v ``` - `-l`:显示完整主类名 - `-v`:显示 JVM 参数 - 输出示例: ``` 1234 com.example.MainApp -Xmx512m 5678 org.apache.catalina.startup.Bootstrap ``` 2. **使用 `tasklist` 命令(系统自带)** 当没有 JDK 环境时: ```cmd tasklist /FI "IMAGENAME eq java.exe" /FI "IMAGENAME eq javaw.exe" /FO TABLE ``` - 同时查找 `java.exe` 和 `javaw.exe`(GUI 程序) - 输出包含 PID、内存占用等信息 3. **使用 `wmic` 命令获取详细信息)** ```cmd wmic process where "name='java.exe' or name='javaw.exe'" get processid,commandline,executablepath ``` - 可获取完整的命令行参数 - 输出示例: ``` CommandLine ExecutablePath ProcessId "C:\jdk\bin\java.exe" -jar app.jar C:\jdk\bin\java.exe 1234 ``` #### 完整操作流程 ```cmd :: 步骤1:检查Java环境 where java :: 步骤2:使用jps(推荐) jps -l -m -v :: 步骤3:备选方案(无JDK时) tasklist /V | findstr /i "java javaw" :: 步骤4:获取进程详细信息 wmic process where "name like '%java%'" get processid,commandline /value ``` #### Java 进程检测代码 如果需要通过 Java 程序实现进程检测: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class JavaProcessFinder { public static void main(String[] args) { List<ProcessInfo> javaProcesses = findJavaProcesses(); javaProcesses.forEach(System.out::println); } public static List<ProcessInfo> findJavaProcesses() { List<ProcessInfo> processes = new ArrayList<>(); try { Process process = Runtime.getRuntime().exec("wmic process where \"name='java.exe' or name='javaw.exe'\" get processid,commandline /format:csv"); try (BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream()))) { String line; boolean firstLine = true; while ((line = reader.readLine()) != null) { if (firstLine || line.trim().isEmpty()) { firstLine = false; continue; } String[] parts = line.split(","); if (parts.length >= 3) { processes.add(new ProcessInfo( parts[1].trim(), // PID parts[2].trim() // CommandLine )); } } } } catch (IOException e) { e.printStackTrace(); } return processes; } static class ProcessInfo { private final String pid; private final String commandLine; public ProcessInfo(String pid, String commandLine) { this.pid = pid; this.commandLine = commandLine; } @Override public String toString() { return "PID: " + pid + " | Command: " + commandLine; } } } ``` #### 常见问题解决 | 问题现象 | 解决方案 | |---------|---------| | `'jps' 不是内部命令` | 将 JDK bin 目录加入 PATH:`set PATH=%PATH%;C:\jdk\bin` | | 查不到 javaw 进程 | 使用 `tasklist /FI "IMAGENAME eq javaw.exe"` | | 需要终止进程 | `taskkill /PID 1234 /F` | | 权限不足 | 以管理员身份运行 CMD | #### 进程属性说明 | 字段 | 说明 | |------|------| | PID | 进程 ID (唯一标识) | | IMAGENAME | 可执行文件名 (java.exe/javaw.exe) | | CommandLine | 启动命令和参数 | | Session# | 会话标识 (0 表示系统服务) | | Mem Usage | 内存占用 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值