1
void restartWeb() {
        try {
            String[] command = new String[] {"webRestarter.exe" , ">>","webLog.log"};
            Runtime.getRuntime().exec(command);
        } catch (java.io.IOException err) {
        webServer.logError(err.getMessage());
        }
    }

为什么这不起作用?我怎样才能修复它,让它像我想要的那样工作?

-- 执行带参数的 webRestarter.exe >>webLog.log

所以它会吐出这样的东西:

webRestarter.exe>>webLog.log
4

4 回答 4

5

您根本不能在exec通话中使用管道。管道是 shell 的功能,而不是操作系统的功能。所以我们必须调用 shell 可执行文件并传递命令。试试这个:

String[] command = new String[] {"cmd.exe", "/c", "start webRestarter.exe", ">>","webLog.log"};
于 2010-08-31T12:35:33.203 回答
1

参数直接传递给 webRestarter.exe 命令。您不能使用参数将标准输出重定向到文件,因为这通常由命令行解释器完成。

但是, exec() 方法返回一个 Process 对象,您可以使用它来检索标准输出并将其写入文件。

资料来源:

http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29

http://download.oracle.com/javase/6/docs/api/java/lang/Process.html

于 2010-08-31T12:30:56.353 回答
1

如果我没记错的话,管道、重定向等是外壳的功能。在这种情况下,这些只是论据。您可以像在命令中使用带有 /c 开关的 cmd.exe 一样简单地处理这个问题,我相信它会正确处理这个问题,或者自己处理标准输入/输出(尽管众所周知这充满了问题,但我更喜欢像commons-exec)。

于 2010-08-31T12:31:38.203 回答
0

只是想我会提到两件可能对使用 Processes 很方便的事情。

  1. ProcessBuilder 是获取流程的好方法(在旨在在 1.5+ JRE 中运行的代码中)。

  2. 建议仔细阅读并执行所有建议当 Runtime.exec() 不会。

于 2010-08-31T16:15:03.540 回答