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;
}
我开始怀疑是不是实际的代码有问题,而不是命令有问题。
发布于 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问题中进行了描述:
发布于 2017-01-27 17:11:40
我认为你发送的整个命令对于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");
以此类推,另外,我不确定您是否可以在这里使用空格,或者您需要将所有内容添加为单独的命令。
builder.command(commands);
builder.directory(new File(workingDir));
process = builder.start();
https://stackoverflow.com/questions/41889981
复制相似问题