2017-01-27 3 views
0

есть ли предел команд в ProcessBuilder?Ограничить команды для 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; 
    } 

Я начинаю задаваться вопросом, есть ли что-то не так с фактическим кодом, а не командами.

+0

Я думаю, что ограничение с cmd.exe –

+0

Im не уверен, почему он не работает, но я бы лично создавать команды = новый ArrayList <>(); а затем pb.command (команды). И почему cmd.exe в первую очередь? всякий раз, когда вы pb.start(); недостаточно ли запускать команды? также укажите рабочий каталог с pb.directory (новый файл (yourWorkingDir)); – LazerBanana

+0

@Krystian_K - команды команды cmd.exe –

ответ

2

Я думаю, что предел вы должны принять во внимание первый является предел команды itselft (то ProcessBuilder), который отличается, если вы на Windows, или Unix.

для Windows, в соответствии с "Command prompt (Cmd. exe) command-line string limitation" documentation:

На компьютерах под управлением Microsoft Windows XP или более поздней версии, максимальная длина строки, которые можно использовать в командной строке составляет 8191 символов. На компьютерах под управлением Microsoft Windows 2000 или Windows NT 4.0 максимальная длина строки, которую вы можете использовать в командной строке, составляет 2047 символов.

Это ограничение относится к командной строке, отдельной среде переменных (таких как переменная PATH), которые наследуются другими процессами и всеми расширениями переменных среды. Если вы используете команду Запрос на запуск командных файлов, это ограничение также относится к пакетному файлу .

Для Unix, я предлагаю вам обратиться к следующему StackOverflow вопрос, который решен в настоящее время:

Кроме того, вы должны принять во внимание предельного размера массива в Java, которая описывается в следующем вопросе о Stackoverflow:

+0

Не уверен, что это он. Начав удивляться, если это что-то не так со всем кодом SwingWorker, так как он работал, когда я не использовал SwingWorker –

0

Я думаю, что вся команда, которую вы отправили, может быть слишком длинной для 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(); 
+0

Таким образом, он не запускает его как cmd.exe? –

+0

Кроме того, выполняет ли этот процесс эти команды в том порядке, в котором я их добавил? –

+0

Он запускает cmd yes и запускает их в том порядке, в котором вы их добавляете. Вы также можете рассмотреть возможность ожидания процесса .waitFor(); для выполнения одной команды перед запуском другой. – LazerBanana

Смежные вопросы