Java ProcessBuilder的命令限制?

Java ProcessBuilder的命令限制?,java,swing,processbuilder,swingworker,Java,Swing,Processbuilder,Swingworker,ProcessBuilder上的命令是否有限制 我有一系列命令: protected String[] cmd = { "dism /mount-wim /wimfile:boot.wim /index:2 /mountdir:mount", "dism /image:mount /add-driver:\"driver\" /recurse", "dism /unmount-wim /mountdir:mount /commit", "dism /mount-w

ProcessBuilder上的命令是否有限制

我有一系列命令:

protected String[] cmd = {
    "dism /mount-wim /wimfile:boot.wim /index:2 /mountdir:mount",
    "dism /image:mount /add-driver:\"driver\" /recurse",
    "dism /unmount-wim /mountdir:mount /commit",
    "dism /mount-wim /wimfile:install.wim /index:" + formPanel.getOsIndex() + " /mountdir:mount"
};
这是我的ProcessBuilder:

ProcessBuilder pb = new ProcessBuilder(
                "cmd.exe", "/c", cmd[0] + " && " + cmd[1] + " && " + cmd[2] + " && " + cmd[3] + " && " + cmd[1] + " && " + cmd[2]
);
但当我运行它时,它会说,&&在这个时候是出乎意料的。当我将processbuilder更改为以下内容时:

ProcessBuilder pb = new ProcessBuilder(
                "cmd.exe", "/c", cmd[0] + " && " + cmd[1] + " && " + cmd[2]
);
那么它工作得很好

所以我的问题基本上就是一个processbuilder可以传递多少个命令是否有某种限制

以下是我的SwingWorker方法的整个部分:

@Override
    protected Integer doInBackground() {

        try {
            ProcessBuilder pb = new ProcessBuilder(
                    "cmd.exe", "/c", cmd[0] + " && " + cmd[1] + " && " + cmd[2] + " && " + cmd[3] + " && " + cmd[1] + " && " + cmd[2]
            );
            pb.directory(new File(formPanel.workspaceDir.toString()));
            pb.redirectErrorStream(true);
            Process p = pb.start();
            String s;
            BufferedReader stdout = new BufferedReader(new InputStreamReader(p.getInputStream()));

            while((s = stdout.readLine()) != null && !isCancelled()) {
                publish(s);
                System.err.println(s);
            }
            if(!isCancelled()) {
                status = p.waitFor();
            }
            p.getInputStream().close();
            p.getOutputStream().close();
            p.getErrorStream().close();
            p.destroy();
        } catch(IOException | InterruptedException ex) {
            ex.printStackTrace(System.err);
        }

        return status;
    }

我开始怀疑实际的代码,而不是命令是否有问题。

我认为首先要考虑的限制是命令本身的限制(然后是
ProcessBuilder
),如果在Windows或Unix上,这是不同的

对于Windows,根据:

在运行Microsoft Windows XP或更高版本的计算机上,最大长度 可以在命令提示下使用的字符串的名称是8191 人物。在运行Microsoft Windows 2000或Windows NT的计算机上 4.0中,可在命令提示下使用的字符串的最大长度为2047个字符

此限制适用于命令行、单个环境 由其他变量继承的变量(如PATH变量) 进程和所有环境变量扩展。如果您使用命令 提示运行批处理文件,此限制也适用于批处理文件 处理

对于Unix,我建议您参考以下已解决的堆栈溢出问题:

此外,您还应考虑Java中数组的限制大小,这将在下面的Stackoverflow问题中描述:


我认为您必须首先考虑的限制是命令本身的限制(然后是
ProcessBuilder
),如果您在Windows或Unix上,这是不同的

对于Windows,根据:

在运行Microsoft Windows XP或更高版本的计算机上,最大长度 可以在命令提示下使用的字符串的名称是8191 人物。在运行Microsoft Windows 2000或Windows NT的计算机上 4.0中,可在命令提示下使用的字符串的最大长度为2047个字符

此限制适用于命令行、单个环境 由其他变量继承的变量(如PATH变量) 进程和所有环境变量扩展。如果您使用命令 提示运行批处理文件,此限制也适用于批处理文件 处理

对于Unix,我建议您参考以下已解决的堆栈溢出问题:

此外,您还应考虑Java中数组的限制大小,这将在下面的Stackoverflow问题中描述:


我认为您发送的整个命令对于cmd.exe来说可能太长,因为您使用了可执行文件,您是否考虑过使用Runtime.exec();还是像这样

    List<String> commands = new ArrayList<>();
    final ProcessBuilder builder = new ProcessBuilder();

    commands.add("dism /mount-wim /wimfile:boot.wim /index:2 /mountdir:mount");

我认为您发送的整个命令对于cmd.exe来说可能太长,因为您使用了可执行文件,您考虑过使用Runtime.exec()吗;还是像这样

    List<String> commands = new ArrayList<>();
    final ProcessBuilder builder = new ProcessBuilder();

    commands.add("dism /mount-wim /wimfile:boot.wim /index:2 /mountdir:mount");


我认为cmd.exeIm的局限性在于它为什么不起作用,但我个人会创建commands=newarraylist();然后是pb.command(commands)。首先为什么是cmd.exe?无论何时您pb.start();运行这些命令还不够吗?还可以使用pb.directory(新文件(yourWorkingDir))指定工作目录@Krystian_K这些命令是cmd.exe特定的命令这可能会有所帮助,我认为cmd.exe的局限性我不知道为什么它不起作用,但我个人会创建commands=new ArrayList();然后是pb.command(commands)。首先为什么是cmd.exe?无论何时您pb.start();运行这些命令还不够吗?还可以使用pb.directory(新文件(yourWorkingDir))指定工作目录@Krystian_K这些命令是特定于cmd.exe的命令这可能有助于它不以cmd.exe的形式运行这些命令?另外,进程是否按照我添加命令的顺序执行这些命令?它确实运行cmd yes,并按照您添加命令的顺序运行这些命令。您也可以考虑等待进程。在运行另一个命令之前先执行一个命令。它不会通过cmd为我运行命令。这是我的代码:尝试将“CMD”作为第一个命令,但是您可能需要使用/c,start来跟随它。我刚刚在这里尝试了一些简单的代码,效果非常好。这样它就不会以cmd.exe的形式运行了?另外,进程是否会按照我添加命令的顺序执行这些命令?它确实会运行cmd yes,并按照您添加命令的顺序运行这些命令。您也可以考虑等待进程。在运行另一个命令之前先执行一个命令。它不会通过cmd为我运行命令。这是我的代码:尝试将“CMD”作为第一个命令,但是您可能需要使用/c,start来跟随它。我刚刚在这里尝试了一些简单的代码,效果非常好。我不确定这就是它。我开始怀疑这是否只是整个SwingWorker代码的问题,因为在我不使用SwingWorker时它确实可以工作。我不确定这就是它。我开始怀疑是不是整个SwingWorker代码出了问题,因为在我没有使用SwingWorker的时候它确实工作了