gpt4 book ai didi

java - 从已经打开的 CMD 中读取 - java

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:50:44 24 4
gpt4 key购买 nike

Java 应用程序是否可以从已经打开的 CMD 窗口读取数据。例如,我打开了一个 cmd,运行“dir”,然后决定运行我的应用程序,我的应用程序有什么方法可以在不打开另一个窗口的情况下读取已经在打开的 CMD 窗口中的信息吗?提前致谢

更新:我希望当一个 Java 应用程序运行时,它会检查所有当前打开的 CMD 窗口,以确保我的另一个命令行应用程序在它自己打开之前没有运行过。

最佳答案

只需在文件中假脱机执行命令的输出。

例如:执行dir > spool.txt并从 java 程序打开带有 FileInputStreamspool.txt 文件。

要确保内容在阅读之前已完全写好,例如,您可以:

  • 在书面文件中使用标记来表示
  • 查看写入文件的修改日期(如果修改日期在规定的时间内没有变化,可能是写入完成的信号)

更新问题:检查 CMD 窗口是否打开

UPDATE: My hope was that when one java application was ran, it would check any currently opened CMD windows to ensure that another one of my command-line applications hadn't been ran before it opened it itself.

您可以使用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"); 应该足够了但为了防止任何副作用或配置错误问题,指定绝对路径更好。


带有新注释的新更新:检查 Java 应用程序是否正在运行

I have used this code for a different section but if there is a cmd window running, there is no guarantee that the user has used it to run my program, package process;

在这种情况下,如果您可以在客户端机器上安装 jdk 工具,您可以检查是否正在运行一个使用 as main class 的 Java 进程,即您的应用程序的主类。
您可以使用 jps ( Java Virtual Machine Process Status Tool )。

这里是可用的选项:

OPTIONS

The jps command supports a number of options that modify the output of the command. These options are subject to change or removal in the future.

-q

Suppress the output of the class name, JAR file name, and arguments passed to the main method, producing only a list of local VM identifiers.

-m

Output the arguments passed to the main method. The output may be null for embedded JVMs.

-l

Output the full package name for the application's main class or the full path name to the application's JAR file.

-v

Output the arguments passed to the JVM.

-V

Output the arguments passed to the JVM through the flags file (the .hotspotrc file or the file specified by the -XX:Flags= argument).

-Joption

Pass option to the java launcher called by jps. For example, -J-Xms48m sets the startup memory to 48 megabytes. It is a common convention for -J to pass options to the underlying VM executing applications written in Java.

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;
}

}

如果您无法安装 jdk 工具,您可以在客户端计算机上的“某处”存储应用程序启动时的进程 ID。您可以使用以下方法检索此信息:ManagementFactory.getRuntimeMXBean().getName()
当它不再运行(停止或崩溃)时,您可以删除此进程 ID 信息。
当应用程序 ia 启动时,如果在客户端计算机上检索到进程 ID,则不允许应用程序启动。
对于停止的应用程序情况,shutdown hook 应该可以完成这项工作。
对于崩溃的应用程序情况,您可以使用守护线程,它根据存储的进程 ID 定期检查应用程序是否始终在运行。

关于java - 从已经打开的 CMD 中读取 - java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43365618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com