2009-09-14 9 views
8

Javaプログラムからバッチファイルを実行したい。Javaからバッチファイルを実行する方法は?

次のコマンドを使用しています。

Runtime.getRuntime().exec("server.bat"); 

しかし、問題は絶対パスではなく正式パスを指定して、そのjavaプロジェクトをどのcompにも展開できるようにすることです。次のように

プロジェクトのディレクトリ構造は以下のようである:

com 
    | 
    project 
    | 
    ------ parser 
    |   |_____ Main.java 
    | 
    -------util 
      |_____ Server.bat 

私は」で「Main.java」ファイルから「utilの」DIRに「Server.bat」ファイルを実行したいですパーサー "dir。

答えて

5

Javaが実行されていて、Runtime.exec()を相対パスで使用すると、JVMが呼び出された現在のユーザーdirecoryに相対的な相対的な意味になります。あなたは、COMの親ディレクトリからJavaを起動する場合

これは

Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat"); 

を動作する可能性があります。

それとも、アブソルートパス計算しなければならない:私は忘れ

Runtime.getRuntime().exec("cmd.exe", "/c", 
System.getProperty("user.dir")+"/com/projct/util/server.bat"); 

は、When Runtime.exec() won'tをお読みください。

+0

3つの文字列パラメータを取るランタイムクラスには "exec"メソッドがありません。 –

+0

それは本当です。私は文字列[]バージョンを意味するが、私はSOのテキストボックスで正方形の親を入力することはできません...私はSOのマニュアル/ wikiを読む必要がありますと思う... – PeterMmm

+0

私は実行する必要がありますCMDから3つの別々のCMDウィンドウがコマンドごとに開かれますが、1つのCMDウィンドウで3つのコマンドをすべて実行できる方法はありますか? – viveksinghggits

6

あなたは、引数 "/ C" と "server.bat" と "CMD.EXE" を実行する必要があります。

Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" }); 
8

あなたはこのためにProcessBuilderを使用することができます。それはexecよりもはるかに多くの制御を提供します。特に、方法directoryで作業ディレクトリを設定することができます。

例:もちろん

ProcessBuilder pb = new ProcessBuilder("server.bat"); 
pb.directory(new File(deployDir + "\\com\\project\\util")); 
Process p = pb.start(); 
int exitStatus = p.waitFor(); 

、あなたのアプリがどこからかdeployDirを取得する必要があります。それは、環境で設定することができます、アプリケーションの設定ファイルでは、現在のユーザーディレクトリまたは何か他のものにすることができます。

+0

なぜ私は分かりません –

0

Plexus utilsには、任意のコマンドラインを呼び出して出力の解析を処理できるコマンドラインタイプがあります。

Commandline cl = new Commandline(); 

cl.setExecutable("cmd.exe"); 
cl.createArg().setValue("/c"); 

cl.setWorkingDirectory(new File(System.getProperty("user.dir"), 
    "/com/project/util/Server.bat")); 

cl.createArg().setValue("/c"); 

StreamConsumer consumer = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

StreamConsumer stderr = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

int exitCode; 

try { 
    exitCode = CommandLineUtils.execute(cl, consumer, stderr, getLogger()); 
} catch (CommandLineException ex) { 
    //handle exception 
} 
0

アプリケーションのインストールディレクトリをシステムに保存し、それを使用してアプリケーション内でパスを構築することをお勧めします。 System.getProperty( "user.dir")は、現在の作業ディレクトリを取得するためにWindowsおよびUnixプラットフォーム上で動作するはずですが、システムに依存しますので注意してください。

0

execの2番目のパラメータは、環境設定のargsのString [](nullはプロセスの現在のものを継承する)で、execの3番目のパラメータは作業ディレクトリを提供するファイルである必要があります。試してみてください:

Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util")); 
4

サポートされている場合は、デスクトップで試すことができます(Java 16)

File file = new File("server.bat"); 
    Desktop.getDesktop().open(file); 
+0

私のために本当に新しい。 – Arshed

関連する問題