繁体   English   中英

如何通过 Runtime.getRuntime().exec() 在命令行应用程序中执行命令

[英]How to execute commands in a command-line application through Runtime.getRuntime().exec()

我正在尝试从 Java 执行第三方命令行应用程序。 该应用程序称为 CWB。 我正在使用以下代码:

process = Runtime.getRuntime().exec(script.sh);

LinkedList<String> stringList = new LinkedList<String>();

BufferedReader reader = new BufferedReader(
    new InputStreamReader(process.getInputStream()));

String line = "";

while ((line = reader.readLine()) != null) {
    stringList.add(line);
}

int exitVal = 0;

exitVal = process.waitFor();
if (exitVal == 0) {
    // Success
    return stringList;
} else {
    // Failure
    return null;
}

这些命令放在文件script.sh (我在 Linux 中)。 该脚本包含以下两个命令:

# Run CWB application from Terminal
./cwb-nc-ccs-x86-linux.bin
# Execute a CWB-specific command
load file_name.ccs

当我从终端执行 CWB 和我通过Runtime.getRuntime().exec()在 Java 中执行它时,行为是不同的。 当我从终端执行 CWB 时,我获得了这个输出:

CWB_output_from_terminal

但是,当我通过Runtime.getRuntime().exec()从 Java 执行时,我在控制台中获得了这个输出:

The Concurrency Workbench of the New Century
(Version 1.2 --- June, 2000)

也就是说,Java 中的 shell 在命令./cwb-nc-ccs-x86-linux.bin之后停止执行。 我想原因是,当我开始 CWB 流程时,就像我进入了一个新的“环境”。 可以注意到,因为我键入命令的光标行以cwb-nc>开头, cwb-nc>图所示。 因此,在一个新的“环境”中而不是在 shell 中,Java 不知道如何将命令传递给这个环境。 我对吗? 如何解决此问题并执行脚本中的其他命令( load file_name.ccs )?

在我的 Java 应用程序中使用 Lilypond 时,我实际上遇到了类似的问题。 我相信您对 Java 命令如何工作的结论是准确的。 它不等同于在命令 shell 中键入,因此我们必须做一些特殊的准备才能让它执行我们想要的操作。

我必须创建一个脚本文件,然后在执行命令中鬼混,直到我找到一个实际打开命令窗口并正确执行命令的文件:

//Run the script
            String command = "cmd.exe /C \"C:/Users/Lindsay Gen10/Documents/NetBeansProjects/capstone/src/main/resources/templates/pdfs/" 
                    + song.getTitle().replaceAll(" ", "") + "Script.sh\"";
            Runtime.getRuntime().exec("cmd /c run cmd.exe /K ");
            Process p = Runtime.getRuntime().exec(command);
            p.waitFor();

通过使用cmd /c run ,它实际上会强制打开一个命令窗口。 我不是 100% 确定这也能解决您的问题,但值得一试!

如果您曾尝试在 Java 之外运行您的脚本,您会发现它在那里也不起作用。 您应该专注于编写一个首先起作用的脚本,并且只有在它起作用时才尝试从 Java 调用它。

此处详细介绍了脚本的问题:将命令作为输入传递给另一个命令(su、ssh、sh 等)

但是,由于您是从 Java 运行的,因此您可以并且可能应该在没有 shell 脚本的情况下完全在 Java 中实现它:

process = Runtime.getRuntime().exec(new String[] { "./cwb-nc-ccs-x86-linux.bin" });
PrintStream writer = new PrintStream(process.getOutputStream());
writer.println("load file_name.ccs");
writer.close();
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM