通过java运行批处理文件但进程永远不会完成

时间:2014-07-10 17:49:21

标签: java batch-file processbuilder openscad

我已经构建了一个单行批处理文件:openscad -o%1%2。

当我运行时,此代码有效:从命令提示符导出output.stl input.scad。

我需要这个在java中运行所以我使用代码:

System.setProperty("user.dir", directory);

String command = "cmd export " + name + ".stl " + name + ".scad";

Process pr = rt.exec(command);

目录是与此进程关联的所有文件的位置,.bat,.scad,openscad.exe。 test.stl也应该在这个目录中输出。

通过这样做我没有从java中获得错误,但导出永远不会发生。

我是否在运行此代码时出错了。 我知道ProcessBuilder会在类似的帖子中推荐,但我不知道数组是如何工作的,也无法找到有关运行它的任何好的文档或教程。

3 个答案:

答案 0 :(得分:0)

您可以尝试这种方式:

List<String> command = new ArrayList<String>();
command.add("export");
command.add(name+".stl");
command.add(name+".scad");

// get the output from the command
StringBuilder stdout = commandExecutor.getStandardOutputFromCommand();
StringBuilder stderr = commandExecutor.getStandardErrorFromCommand();

// print the output from the command
System.out.println("STDOUT");
System.out.println(stdout);
System.out.println("STDERR");
System.out.println(stderr);

答案 1 :(得分:0)

我认为你不需要包含cmd位。我写了一个小例子,说明如何使用ProcessBuilder为Windows中的记事本可执行文件提供参数。它应该和你正在做的一样。

package test;
import java.io.File;
import java.util.LinkedList;

public class MainTest {

    public static void main(String[] args){
        System.out.print("Starting");
        try
        {
            File f = new File("TestStuff.txt");
            f.createNewFile();
            ProcessBuilder pb = new ProcessBuilder();
            LinkedList<String> cmds = new LinkedList<String>();
            cmds.add("notepad");
            cmds.add("TestStuff.txt");
            pb.command(cmds);
            Process p = pb.start();
            p.waitFor();
        }
        catch (Exception e) {

        }
    }   
}

这与打开CMD并输入记事本TestStuff.txt相同。

另外需要注意的是,有些应用程序要求您从输入流中读取它们才能完成。如果记事本这样操作,p.waitFor()只会在外部进程被杀死时返回。因此,请务必阅读流程中的输入流。

我还使用各种jar文件测试了这个,比如

....
cmds.add("java");
cmds.add("-jar");
cmds.add(pathToSomeExecutableJar);
....

授予我已经包含了从这样的流中读取的代码:

InputStream is = p.getInputStream();
BufferedReader bsr = new BufferedReader(new InputStreamReader(is));
String s;
while ((s = bsr.readLine()) != null) System.out.println(s);

答案 2 :(得分:0)

Java代码:

Runtime.getRuntime().exec("cmd.exe /c start " + directory + "\\export.bat " + directory+ " " + name + ".stl " + name + ".scad");

批处理文件:

cd %1
openscad.exe -o %2 %3
exit

启动并输入正确的目录是修复。