【问题标题】:Does running a batch file from java program destroy piping?从java程序运行批处理文件会破坏管道吗?
【发布时间】:2011-09-19 22:03:57
【问题描述】:

我试图从我的 Java 程序中运行一个批处理文件,但我遇到了一些奇怪的行为。

Process p = Runtime.getRuntime().exec("cmd /c start temp.bat");

这通常运行良好,但我发现批处理文件中的管道命令不起作用。有什么建议吗?

【问题讨论】:

  • 好的,所以当我运行它时,我的批处理文件中的任何管道命令都不起作用(即不能让批处理文件将输出写入文本文件)。我认为它有,因为 JRE 正在获取此输出以供 InputStream 访问。
  • 好的!最后。原来这与我的 IDE(Netbeans)有关。当我在我的 IDE 中测试我的应用程序时,我的批处理文件中的管道不起作用。但是如果我在 IDE 之外运行它(构建它并运行 JAR 文件),管道工作正常。

标签: java file batch-file command piping


【解决方案1】:

您是否处理了流程中的流?如果您不阅读它们 - 您的进程将会挂起。

您的具体问题是什么?

编辑:也许这个answer会帮助你

【讨论】:

  • 我实际上并没有读取流,而且我可以很好地执行批处理文件(没有管道)而不会挂起。为什么会这样?
  • 它可以在不同的操作系统、不同的硬件等上以不同的方式运行。输出很少的脚本可以正常运行,因为它们不会溢出系统。仅当您填充流直到它们满负荷时才会出现问题,此时进程挂起。至于管道 - 这很奇怪,你确定使用管道的脚本没有更多的输出吗?
  • 我觉得问题的根源在于 Runtime.exec() 正在创建一个 cmd.exe 进程。但是 cmd.exe 进程又会创建一个进程来运行批处理文件。
【解决方案2】:

使用您 getOutputStream() 和 getInputStream() 的 Process 对象来重定向来自进程的 I/O。

【讨论】:

  • 我认为问题在于进程 p 是为 cmd.exe 实例化的,它没有任何 I/O,因为它会立即调用批处理文件。我认为批处理文件最终会成为一个新进程,因此 p.getOutputStream() 和 p.getInputStream() 不会从批处理文件的执行中获取 I/O。
【解决方案3】:

我建议您使用 CommonsExec,这将使您的生活更轻松。您可以使用这样的代码(未经测试):

CommandLine cmdLine = new CommandLine("ping");
cmdLine.addArgument( host );

ByteArrayOutputStream stdout = new ByteArrayOutputStream();
PumpStreamHandler     psh    = new PumpStreamHandler( stdout );

DefaultExecutor executor = new DefaultExecutor(); 
executor.setStreamHandler( psh );

try {
  executor.execute( cmdLine );
} catch ( Exception e ) {
}

System.out.println( stdout.toString() );

【讨论】:

  • 它是一个包装库,用于通过 Java 以可移植的方式执行外部应用程序。
猜你喜欢
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2023-03-26
  • 2013-04-16
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多