【发布时间】:2017-06-12 21:35:11
【问题描述】:
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]
);
然后它就可以正常工作了。
所以我的问题基本上只是单个进程构建器可以传递多少个命令是否存在某种限制?
这是我的 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;
}
我开始怀疑实际代码是否有问题,而不是命令。
【问题讨论】:
-
我认为限制是 cmd.exe
-
我不确定为什么它不起作用,但我会亲自创建 commands = new ArrayList();然后是 pb.command(commands)。为什么首先要使用 cmd.exe?每当你 pb.start();运行命令还不够吗?还使用 pb.directory(new File(yourWorkingDir)); 指定工作目录;
-
@Krystian_K 命令是 cmd.exe 特定命令
标签: java swing processbuilder swingworker