我已经构建了一个单行批处理文件: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会在类似的帖子中推荐,但我不知道数组是如何工作的,也无法找到有关运行它的任何好的文档或教程。
答案 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
启动并输入正确的目录是修复。