21

我想使用 ProcessBuilder 类通过我的 Java 应用程序顺序执行 2 个或更多命令。我已经尝试了其他回复/论坛中建议的多个选项,但没有运气。

以下是我尝试过的事情:

    ProcessBuilder processBuilder = new ProcessBuilder("ls", ";", "pwd");

给我以下错误:

错误:ls:;:没有这样的文件或目录错误:ls:pwd:没有这样的文件或目录

    ProcessBuilder processBuilder = new ProcessBuilder("ls", "&&", "pwd");

给我类似的错误:

错误:ls:&&:没有这样的文件或目录错误:ls:pwd:没有这样的文件或目录

    List<String> command = new ArrayList<String>();
    command.add("ls");
    command.add(";");
    command.add("pwd");
    ProcessBuilder processBuilder = new ProcessBuilder(command);

给我以下错误:

错误:ls:;:没有这样的文件或目录错误:ls:pwd:没有这样的文件或目录

我的操作系统是 Linux/Mac-OSX。

4

3 回答 3

28

您的方法等效于ls使用指定的参数进行调用。在 Bash 表示法中,您正在运行的是:

ls ';' pwd
ls '&&' pwd

如果您希望lspwd作为单独的命令运行,您可以使用 Bash(或另一种 shell 语言)将它们包装成一个命令:

bash -c 'ls ; pwd'

你可以这样称呼:

ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", "ls ; pwd");
于 2012-09-04T17:34:54.437 回答
7

我正在使用 ProcessBuilder 来编译这样的 java 程序,它对我有用:

ProcessBuilder b = new ProcessBuilder("cmd.exe","/c","cd " + dir,
            " & javac " + mapClassName + ".java -cp " + pathToProjectClasses);
  • cmd.exe :它启动命令提示符。
  • \c :不确定它在做什么,但它很重要,您可以查看此链接以获取更多信息(\? cmd 命令)
  • cd + dir :是第一个命令,它将目录更改为某个路径,即 dir。
  • & :它的意思是在你完成第一个命令后开始第二个命令
  • javac :这个词和字符串的其余部分是第二个命令
  • -cp :要编译的类使用的外部类的路径。

所以我有 2 个命令,第一个是cd命令,第二个是javac命令,我使用&.

抱歉我的写作技巧不好,如果我没有很好地解释我的代码,请向我询问您想知道的任何事情。

于 2019-06-19T10:11:27.643 回答
3

您可以从第一个命令中的ProcessBuilder.start()获取进程,使用waitFor()等待,然后启动第二个命令。

于 2012-09-04T17:35:00.177 回答