我正在获取一个exe-File,我必须在Windows Server 2008 R2上使用Java(版本6)执行。现在有一个我不太懂的问题。使用命令行
执行文件时"C:\test.exe param1 param2"
它可以正常工作,但是当我用
执行文件时Process proc = Runtime.getRuntime().exec("C:\\test.exe param1 param2");
proc.waitFor();
我可以在Windows任务管理器中看到test.exe并且它开始运行(它会创建一个说明该情况的日志),但之后它就不再做任何事了。 test.exe以0%无限运行,我必须手动终止进程。完成后,java程序继续并
proc.exitValue()
是“1”,因此java认识到我已经杀死了这个进程。我还尝试在批处理文件中编写命令行并使用.exec()执行它,但它没有改变任何内容。
让我感到困惑的是,它通过Windows命令行完美运行,但不通过.exec()。有谁知道什么可能导致这样的问题?或者test.exe是否更有可能导致问题?
最好的问候
编辑:写下.exec中的错误路径
答案 0 :(得分:2)
由于你的程序产生了很多输出,我的假设是它试图写入标准输出(这是Linux下的管道,不知道Windows)。
试试这个:
final byte[] devnull = new byte[1024];
final ProcessBuilder builder = new ProcessBuilder("C:\\test.exe", "param1", "param2")
.redirectErrorStream(true);
final Process p = builder.start();
final InputStream stdout = process.getInputStream();
// Purge stdout
while (stdout.read[devnull] != -1);
// Grab the process' exit code here
答案 1 :(得分:0)
"C:\test.exe param1 param2"
你有一个标签。试试这个:
"C:\\test.exe param1 param2"
如果进程在stdout或stderr上产生任何输出,则需要使用它。否则它会阻止。
答案 2 :(得分:0)
正如https://stackoverflow.com/a/21903969中指出的那样,消耗流程产生的所有输出非常重要 - 不仅在Linux上,而且在Windows上,不仅是标准输出,还有可能错误。
这种情况的一般模式可能如下所示:
private static void runCommand(String command) throws IOException
{
Process process = Runtime.getRuntime().exec(command);
String errorMessage =
new String(toByteArray(process.getErrorStream()));
String outputMessage =
new String(toByteArray(process.getInputStream()));
int exitValue = 0;
try
{
exitValue = process.waitFor();
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
System.out.println("Output message: "+outputMessage);
System.out.println("Error message: "+errorMessage);
System.out.println("Exit value: "+exitValue);
}
private static byte[] toByteArray(
InputStream inputStream) throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buffer[] = new byte[8192];
while (true)
{
int read = inputStream.read(buffer);
if (read == -1)
{
break;
}
baos.write(buffer, 0, read);
}
return baos.toByteArray();
}