0

我已经建立了一个单行批处理文件: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 在类似的帖子中被推荐,但我不知道数组是如何工作的,也找不到任何好的文档或教程来运行它。

4

3 回答 3

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);
于 2014-07-10T18:04:41.437 回答
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);
于 2014-07-10T20:05:53.590 回答
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

启动并输入正确的目录是解决方法。

于 2014-07-11T14:21:50.187 回答