更新: 我的希望是当一个Java应用程序运行时,它会检查任何当前打开的CMD窗口,以确保在它自己打开之前没有运行另一个命令行应用程序。
dir > spool.txt
命令,并从 java 程序使用 FileInputStream
打开 spool.txt
文件。更新带有更新的问题:检查CMD窗口是否已打开
更新:我希望当运行一个Java应用程序时,它将检查当前打开的任何CMD窗口,以确保在它自己打开之前没有运行另一个命令行应用程序。
您可以使用 tasklist.exe
程序列出 Windows 上正在运行的进程。
通过每个进程获取一行信息。
然后,检查其中一行是否以 cmd.exe
开头。
如果是这样,则表示已经运行了一个 cmd.exe
程序。
以下是示例代码;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CmdProcessSearch {
public static void main(String[] args) throws IOException {
boolean anyCmdProgramOpened = isAnyCmdProgramOpened();
System.out.println("isOpened = " + anyCmdProgramOpened);
}
public static boolean isAnyCmdProgramOpened() {
Process p;
try {
p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "tasklist.exe");
String line;
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
if (line.startsWith("cmd.exe")) {
return true;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
C:\windows\system32
通常在PATH环境变量中。
因此,p = Runtime.getRuntime().exec("tasklist.exe");
应该足够了,
但为了防止任何副作用或配置问题,最好指定绝对路径。
我已经在不同的部分使用了这个代码,但如果有一个命令窗口正在运行,就不能保证用户已经使用它来运行我的程序,进程包;
在这种情况下,如果您可以在客户端机器上安装jdk工具,则可以检查是否正在运行Java进程,使用您的应用程序的主类作为主类。
您可以使用jps
(Java虚拟机进程状态工具)。
这里是可用的选项:
选项
jps 命令支持多个选项,可以修改命令的输出。这些选项可能会在未来发生变化或被删除。
-q
省略类名、JAR 文件名和传递给主方法的参数的输出,仅输出本地 VM 标识符列表。
-m
输出传递给主方法的参数。对于嵌入式 JVM,输出可能为空。
-l
输出应用程序主类的完整包名或应用程序 JAR 文件的完整路径名。
-v
输出传递给 JVM 的参数。
-V
输出通过标志文件(.hotspotrc 文件或 -XX:Flags= 指定的文件)传递给 JVM 的参数。
-J 选项
将选项传递给 jps 调用的 java 启动器。例如,-J-Xms48m 将启动内存设置为 48 兆字节。通常使用 -J 将选项传递给执行 Java 编写的应用程序的底层 VM。
jps -l
命令输出应用程序主类的完整包名或应用程序JAR文件的完整路径名。
这是一个示例代码,通过搜索应用程序的主类process.JavaProcessSearch
:
package process;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class JavaProcessSearch {
public static void main(String[] args) throws IOException {
boolean isProcessRunning = isAJavaProcessWithMainClass("process.JavaProcessSearch");
System.out.println(isProcessRunning);
}
public static boolean isAJavaProcessWithMainClass(String mainClass) {
Process p;
try {
String javaHome = System.getenv("JAVA_HOME");
p = Runtime.getRuntime().exec(javaHome + File.separator + "bin/jps -l");
String line;
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
if (line.contains(mainClass)) {
return true;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
ManagementFactory.getRuntimeMXBean().getName()
。
jps -l
命令。我已经更新了新的代码。 - davidxxx