Java ProcessBuilder的命令限制?
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
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,我建议您参考以下已解决的堆栈溢出问题:
ProcessBuilder
),如果您在Windows或Unix上,这是不同的
对于Windows,根据:
在运行Microsoft Windows XP或更高版本的计算机上,最大长度
可以在命令提示下使用的字符串的名称是8191
人物。在运行Microsoft Windows 2000或Windows NT的计算机上
4.0中,可在命令提示下使用的字符串的最大长度为2047个字符
此限制适用于命令行、单个环境
由其他变量继承的变量(如PATH变量)
进程和所有环境变量扩展。如果您使用命令
提示运行批处理文件,此限制也适用于批处理文件
处理
对于Unix,我建议您参考以下已解决的堆栈溢出问题:
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的时候它确实工作了