【问题标题】:exec from Java: looking up appropriate script executorsexec from Java:查找合适的脚本执行器
【发布时间】:2026-01-10 23:55:01
【问题描述】:

我们目前正在编写一个 java 应用程序,该应用程序涉及让用户从我们的程序中执行另一个程序。这个其他程序可以是另一个可执行文件或脚本,并且可以采用任意数量的命令行参数。我们已经构建了一个 GUI 来执行此操作,并且在基本功能案例中,它可以工作。

我们正在使用 apache exec 来执行此操作,尽管此时我实际上并不确定它给我们带来了什么价值。

我遇到的问题是已知的脚本文件类型。

如果您打开 powershell 并输入 ./myVisualBasicScript.vbs,它将在内部将其转换为类似 wscript.exe ./myVisualBasicScript.vbs 的命令。同样,iirc,如果你在 bash 中输入./someTCShellScript.tcsh,它会调用 tcshell 下的那个脚本。

我想知道是否有一个库可以为我提供这种映射。理想情况下,这个库是我可以做类似的事情的地方

CommandLine cmd = new com.awesome.library.CommandLine(
    pathToExecutableOrScript,
    args
);

cmd.execute();

如果这样的库支持看门狗和超时以及信号处理等,那就太好了,但我正在寻找的主要功能是某种从文件类型(最好同时使用扩展名和元属性)映射到运行它们的可执行文件。

我一直在我们的应用程序中构建地图,并且我至少知道 javas java.awt.Desktop.open() 方法,它几乎可以为我完成这项工作,尽管它更适合 GUI 应用程序。我不确定它是否具有捕获标准输入、输出和错误的功能,或者是否有看门狗和超时等。

非常感谢任何帮助。

【问题讨论】:

  • 已标记:要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于 Stack Overflow 来说是题外话,因为它们倾向于吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
  • ...除非只有在图书馆存在的情况下才能做到这一点?如果我们谈论的是 XStream 与 GSon,那么您是对的,但这并不是在一组库中要求一个库,而是在问存在这样一个库。

标签: java bash powershell process exec


【解决方案1】:

您可以使用ProcessBuilder 这样做

// Create ProcessBuilder.
ProcessBuilder p = new ProcessBuilder();
// Use command "notepad.exe" and open the file.
p.command("notepad.exe", "C:\\file.txt");
p.start();

或者

Process p = Runtime.getRuntime().exec("cmd /c start " + file.getAbsolutePath());

【讨论】:

  • and exec("sh", "bashScript") and exec("powershell", "script.ps1") and exec("ansys", "apdlScript.m") and exec("matlab", "matlabscript.m") and exec("????", "scripItThatIDontKnowAbout.funnyExt")... 等等。作为开发人员,我没有技能或时间来构建完整的脚本语言及其执行器列表。我更愿意利用一个库,它本身利用诸如 windows 文件扩展注册表和类似的 linux 工具来执行这些文件。
  • 从 Java 程序调用不同脚本的想法似乎有点奇怪。通常情况正好相反,因为 Java 程序应该在不同的环境中运行。这样做是强制性的吗?反正我不知道你需要这样的图书馆。但我正在考虑创建一个批处理文件,它将调用每种支持的脚本类型并从 Java 中调用它。
  • 我们有这个策略是不可避免的业务需求。将这个问题引入脚本语言的想法是一个有趣的(对我来说应该很明显)的想法。