首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ProcessBuilder的命令限制?

ProcessBuilder的命令限制?
EN

Stack Overflow用户
提问于 2017-01-27 16:50:15
回答 2查看 993关注 0票数 0

ProcessBuilder上的命令有限制吗?

我有这个命令数组:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
ProcessBuilder pb = new ProcessBuilder(
                "cmd.exe", "/c", cmd[0] + " && " + cmd[1] + " && " + cmd[2] + " && " + cmd[3] + " && " + cmd[1] + " && " + cmd[2]
);

但是当我运行它的时候,它会说'&&在这个时候是意外的‘。当我将processbuilder更改为以下内容时:

代码语言:javascript
运行
复制
ProcessBuilder pb = new ProcessBuilder(
                "cmd.exe", "/c", cmd[0] + " && " + cmd[1] + " && " + cmd[2]
);

那么它工作得很好。

所以我的问题基本上是,单个processbuilder可以传递的命令数量是否有一定的限制?

下面是我的SwingWorker方法的整个片段:

代码语言:javascript
运行
复制
@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;
    }

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

EN

回答 2

Stack Overflow用户

发布于 2017-01-27 17:06:52

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

根据"Command prompt (Cmd. exe) command-line string limitation" documentation的说法,对于Windows来说:

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

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

对于Unix,我建议您参考下面的Stackoverflow问题,这个问题现在已经解决了:

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

票数 3
EN

Stack Overflow用户

发布于 2017-01-27 17:11:40

我认为你发送的整个命令对于cmd.exe来说可能太长了,因为你使用的是可执行文件,你有没有考虑过使用Runtime.exec();或者类似这样的东西?

代码语言:javascript
运行
复制
    List<String> commands = new ArrayList<>();
    final ProcessBuilder builder = new ProcessBuilder();

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

以此类推,另外,我不确定您是否可以在这里使用空格,或者您需要将所有内容添加为单独的命令。

代码语言:javascript
运行
复制
    builder.command(commands);
    builder.directory(new File(workingDir));

    process = builder.start();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41889981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档