2015-10-20 337 views
1

我想运行带有文本输入和输出的C++程序exe,但不知何故,processbuilder返回255并且不打印结果以输出txt。Java Processbuilder返回255

public static void runCommandPrompt(String[] cmds) { 
    ProcessBuilder compileProcessBuilder = new ProcessBuilder(cmds); 
    Process compileProcess = null; 
    try { 
     compileProcess = compileProcessBuilder.start(); 
     int exitValue = compileProcess.waitFor(); 
     System.out.println(exitValue); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 



public static void main(String[] args){ 
    String[] evaluateCommands = { "cmd", 
       "/c", 
       "cd C:\\TestPath & select.exe <C:\\input.txt >C:\\output.txt" }; 
    runCommandPrompt(evaluateCommands); 
} 

回答

3

尝试将子进程的所有输出重定向到主进程。我相信你会看到错误原因。

ProcessBuilder compileProcessBuilder = new ProcessBuilder(cmds); 

// redirect all IO separately 
compileProcessBuilder.redirectInput(ProcessBuilder.Redirect.INHERIT); 
compileProcessBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
compileProcessBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); 

// or use a convenient call for all at once (thanks VGR to mention it) 
compileProcessBuilder.inheritIO(); 

Process compileProcess = compileProcessBuilder.start(); 

更新

如果您手动启动他们做些什么呢过程的回报?也许他们真的会返回这些退出代码。

run.cmd

select.exe <C:\input.txt >C:\output.txt 
echo %ERRORLEVEL% 
+1

你也可以做到这一点的一个方法调用。compileProcessBuilder [inheritIO()](http://docs.oracle.com/javase/8/docs/api /java/lang/ProcessBuilder.html#inheritIO--) – VGR

+0

@VGR你说得对。我只想显示详细的版本。我把你的评论放入答案中。这是一个很好的补充。 – SubOptimal

+0

感谢您的帮助。但我有另一个问题。我是C++讲座的助教。所以尝试自动编译和测试结果。所以我决定编写Java程序。程序获取作业文件夹。然后在foreach文件夹中,它调用cl编译器并创建一个exe文件。在该程序尝试测试用例之后,却出现了问题。程序在for循环foreach中运行exe,但有些进程返回正确,但有些进程失败并返回255或-1073741819。我不明白为什么一些exes失败了相同的命令,并且不会让其他人失败。当我使用您的解决方案时,问题仍然存在 – Yunus