1

Java アプリから .bat ファイルを呼び出そうとしています。シンプルに見えますが、2 つの問題があり、アドバイスをいただければ幸いです。

  1. 以下のコードは、引数文字列が 94 文字を超えているため、bat ファイルの実行に失敗します。(文字列の末尾から末尾の「x」を削除することにより)正確に94文字を使用するとclientArgs、batファイルは正常に実行されます。
    (別の呼び出しを使用して args を渡す場合と同じ問題String[])
    とにかく、もっと長いコマンド文字列 (~150 文字) を渡すことができる必要があります。

  2. clientArgs完全なファイル名ではなく短い名前のみを含める ように を変更すると (作業ディレクトリを指定しているため)、次のようになります。

    java.io.IOException: Cannot run program "client.bat" (in directory "C:\2\code\FlaFl\flafl-0.7-RC2"): CreateProcess error=2, The system cannot find the file specified

コードは次のとおりです。

public static void main(String[] args) {  
    String CMD_FILE_NAME = "client.bat"; //cmd or bat - still limit'n is 94 chars
    String cmdFileFolder= "C:/2/code/FlaFl/flafl-0.7-RC2/"; 
    File workingDir = new File(cmdFileFolder);
    String clientArgs = cmdFileFolder + 
         CMD_FILE_NAME + " -host name12.mycompanyname3.com -app hive"
         + "123456789 34x";  //95 chars fails. remove the x to get it to work
    System.out.println("length of invoc str is "+clientArgs.length());
    Process process=null;
    try {
         process = Runtime.getRuntime().exec(clientArgs,null,workingDir);
    } catch (IOException e) {
         System.out.println("exception "+e);
    }
    //sleep(2000);
    //if (process!=null)
    //    process.destroy();
}
4

4 に答える 4

1

http://en.wikipedia.org/wiki/COMMAND.COMから

対話モードでのコマンド ラインの長さは 126 文字に制限されています。

これが問題の原因である可能性があります。

.bat代わりにファイルを作成して実行できます。

于 2012-08-21T12:04:18.820 に答える
1

Exec の Java Doc が提案する

ProcessBuilder.start() は、変更された環境でプロセスを開始するための推奨される方法になりました。

于 2012-08-21T12:04:38.417 に答える
0

あなたの問題を再現しようとして、はるかに長い引数行でコマンドを正常に実行しました。
挿入してみる

  try {
        p.waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

コマンドを実行した後(コメントされたものの代わりにsleep() ...)、コマンドを終了できるようにします。

このアプローチには実際には別の問題があります(最初はあなたの問題かもしれないと思いました)-プロセスがコンソールバッファを満たすのに十分なデータを書き込むと、ここで説明されているようにブロックされる可能性があります(プロセスのjavadoc):

一部のネイティブ プラットフォームでは、標準の入力ストリームと出力ストリームに対して限られたバッファー サイズしか提供されないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りが迅速に行われないと、サブプロセスがブロックされたり、デッドロックが発生したりする可能性があります。

したがって、最初に読む必要があります。

InputStream is=process.getInputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(is));

String line=new String();
while ((line=br.readLine())!=null) System.out.println (line);  //do something real here

バット出力を読みたくない場合 (そして、私はあなたがそうしているとは思いません)、それをすべてスキップして、別のウィンドウでコマンドを実行することができます:
cmd /c start \"my command\" c:/temp/startup.bat args

(作業ディレクトリを使用する 2 番目のフォームについて注意してくださいcmd /c startup.bat arguments。「見つからない」例外を取り除くために使用します)

于 2012-08-21T20:23:28.670 に答える
0

次のコードを使用してみてください:

public static void main(String[] args) {
    String CMD_FILE_NAME = "client.bat"; // cmd or bat - still limit'n is 94
                                            // chars
    String cmdFileFolder = "C:/2/code/FlaFl/flafl-0.7-RC2/";
    File workingDir = new File(cmdFileFolder);
    String clientArgs = CMD_FILE_NAME
            + " -host name12.mycompanyname3.com -app hive"
            + "123456789 34x"; // 95 chars fails. remove the x to get it to
                                // work
    System.out.println("length of invoc str is " + clientArgs.length());
    Process process = null;
    try {
        process = Runtime.getRuntime().exec(clientArgs, null, workingDir);
    } catch (IOException e) {
        System.out.println("exception " + e);
    }
    // sleep(2000);
    // if (process!=null)
    // process.destroy();
}

メソッドに渡すときにcmdFileFolder、コマンド、つまりコード内の作業ディレクトリを指定しています。workingDirRuntime.exec()

于 2012-08-21T12:08:32.303 に答える