2017-01-27 24 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 pb = new ProcessBuilder(
       "cmd.exe", "/c", cmd[0] + " && " + cmd[1] + " && " + cmd[2] 
); 

次に正常に動作します。

私の質問は基本的に、単一のプロセスビルダが通過できるコマンドの数に制限がある場合だけですか?

@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; 
    } 

私は実際のコードではなく、コマンドに何か問題があるのか​​どうか疑問を始めています:

は、ここに私のSwingWorkerの方法の全体のセグメントです。

+0

私はそれが動作しませんが、私は個人的に=新しいArrayListを<>()コマンドを作成する理由の制限はcmd.exeの –

+0

イムわからないとだと思います。 pb.command(コマンド)を実行します。なぜcmd.exeが最初の場所にあるのですか?あなたがいつでもpb.start();コマンドを実行するには十分ではありませんか?また、pb.directory(新しいファイル(yourWorkingDir))で作業ディレクトリを指定します。 – LazerBanana

+0

@Krystian_Kコマンドはcmd.exe固有のコマンドです –

答えて

2

私はあなたが最初に考慮に入れる必要はあり制限がWindowsまたはUnixを使っている場合には異なっている(その後、ProcessBuilder itselftコマンドの限界だと思います。 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の質問を参照することをお勧め:また

、あなたは内の配列の上限サイズを考慮すべきです次のStackoverflow質問に記載されているJava:

+0

これはそれであるか分かりません。私はSwingWorkerを使用していないときに動作したので、SwingWorkerコード全体に何か問題があるのだろうかと疑問に思っています。 –

0

私はあなたのRuntime.exec()を使用して考えられなかった、あなたがそこに実行可能ファイルを使用して、あなたが送られたコマンド全体がcmd.exeのために長すぎるかもしれないと思います。またはこれのような何か?

List<String> commands = new ArrayList<>(); 
    final ProcessBuilder builder = new ProcessBuilder(); 

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

などなど、additionalyあなたはここに空白を持つことができるかどうかわからないイム、またはあなたが別々のコマンドとして、すべてを追加する必要があります。

builder.command(commands); 
    builder.directory(new File(workingDir)); 

    process = builder.start(); 
+0

それはcmd.exeとして実行されません。 –

+0

また、プロセスはそれらのコマンドを追加した順に実行しますか? –

+0

これはcmd yesを実行し、追加した順序で実行します。また、process.waitFor();で待機することも考えられます。別のコマンドを実行する前に1つのコマンドを実行する。 – LazerBanana

関連する問題