【问题标题】:command does not execute successfully when run through java code using runtime.getruntime command使用 runtime.getruntime 命令通过 java 代码运行时命令未成功执行
【发布时间】:2015-03-25 16:44:38
【问题描述】:

我有一个命令在直接在命令提示符下运行时成功执行,但是当使用 runtime.getruntime.exec("command"); 通过 java 代码运行相同的命令时它没有提供所需的输出。为什么运行不正常??

我正在执行的命令是更改管理员密码和我想要重定向到文件的命令输出。命令如下:

进程 p=Runtime.getRuntime().exec("net user administrator 1234 > yjs.txt 2>&1");

如果我在命令提示符下直接运行“net user administrator 1234 > yjs.txt 2>&1”,它会正确执行,即创建文本文件 yjs.txt 并将输出重定向到文件中..

但是当我通过 java 代码执行相同的命令时,文件 yjs.txt 根本没有创建。编译时它甚至没有给出错误消息。知道为什么吗??

【问题讨论】:

  • 你检查所有的权利和权限了吗?虽然,那么您至少应该收到错误消息。也许该文件已创建,但按预期在另一个目录中。

标签: java cmd


【解决方案1】:

您的命令提示符不仅仅是运行一个可执行文件,Runtime.exec() 就是这样做的。例如,输出重定向 (> yjs.txt 2>&1) 是命令提示符的一项功能,但不是 Java 的一项功能。

如果要将输出重定向到文件,有两种选择:

  • 将包括输出重定向在内的完整命令放入批处理文件(或 shell 脚本,具体取决于您的操作系统)并从 Java 执行该批处理文件。
  • 使用exec() 返回的Process 对象,并将您从该对象接收的输出和错误流写入自己的文件。

实际上,无论如何你都应该做第二种情况。如果您启动的命令生成大量输出,那么如果您的代码没有使用该输出,它可能会开始阻塞。看看http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html,它详细解释了Runtime.exec() 可能存在的缺陷,并提供了如何处理它的解决方案(例如使用文章清单4.5 中的StreamGobbler)。

【讨论】:

  • @Balaji Katika 和大提琴非常感谢.. 我使用大提琴的方法来使用进程对象.. 及其工作:)
【解决方案2】:

这是因为 Runtime.getRuntime.exec() 命令创建的默认子进程没有自己的终端或控制台。它的所有标准 I/O(即 stdin、stdout、stderr)都将被重定向到父进程,并且可以通过 getInputStream/getOutputStream/getErrorStream 访问它们。 您可以尝试通过 p.getOutputStream 读取命令“net user administrator 1234”的输出,并使用 File I/O 将其显式写入 yjs.txt 文件

此外,ProcessBuilder 是执行命令的首选方式,除非您被古老的 JVM 卡住。有关示例和文档,请参阅 http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多