【问题标题】:Java ProcessBuilder to start execute multiple commands sequentially in LinuxJava ProcessBuilder开始在Linux中顺序执行多个命令
【发布时间】:2012-09-04 17:30:28
【问题描述】:

我想使用 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。

【问题讨论】:

    标签: java processbuilder


    【解决方案1】:

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

    ls ';' pwd
    ls '&&' pwd
    

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

    bash -c 'ls ; pwd'
    

    你可以这样称呼:

    ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", "ls ; pwd");
    

    【讨论】:

    • @ruakh 你能告诉我如何使用基于 Windows 的 PsExec.exe 进行包装。例如,导航到“C”驱动器并创建一个名为“abc”的目录,例如:new ProcessBuilder("psexec", "-c", "cd c:\ ; mkdir abc");。非常感谢。
    • @Channa:我不知道一般情况,但我认为你的具体例子可以写成new ProcessBuilder("psexec", computer, "mkdir", "C:\\abc")。
    【解决方案2】:

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

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

    所以我有 2 个命令,第一个是 cd 命令,第二个是 javac 命令,我使用 &amp; 按顺序执行它们。

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

    【讨论】:

    • /c 用于自动关闭
    【解决方案3】:

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

    【讨论】:

    • 你能分享一个例子吗
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2017-03-07
    • 2012-03-11
    • 2023-03-11
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多