2010-11-19 26 views
1

私は引数を渡す私のJavaプログラムでシェルスクリプトを実行したいの引数で別のJava PROGRAMAを呼び出すbashスクリプトにJavaプログラムを形成怒鳴る示した:渡す引数は

Runtime.getRuntime().exec("./test.sh " + "\\\"param1\\\"\\\"param2\\\"\\\"param3\\\""); 

をそしてtest.shを呼び出します。このように文字列引数を渡す別のJavaプログラム:この形式で引数を解釈しますanther.jar

another.jar \"param1\"\"param2\"\"param3\" 

し、最終的にプログラム

another.jar "param1""param2""param3" 

私は少しは私が最初のコマンドでは、いくつかの文字列形式を試してみましたが、私は正しいフォームを取得できませんでした。このsituation..kkk

にエスケープ文字を正しく扱うことができないこのbacauseと混同です。

助けてもらえますか?

Thx!

+0

あなたが開始するためにあなたの引数を囲む引用符が必要なのはなぜ?ターゲット.jarは引数を引用符で囲んでいますか? – birryree

答えて

3

私はあなたがexec(String[] cmdarray)代わりのexec(String cmd)を使用したほうが良いと思います。これは、exec(String cmd)StringTokenizerを介して引数をトークン化するためです。コマンドライン引数を分割するときには、二重引用符にはまったく注意を払っていません。

はこのような何かを試してみてください:PARAM値の内部

ArrayList<String> argList = new ArrayList<String>(); 
argList.add("param1"); 
argList.add("param2"); 
argList.add("param2"); 
String[] args = argList.toArray(new String[argList.size()]); 
Runtime.getRuntime().exec("mycommand", args); 

文字は、Javaのソースコードの文字列リテラルは、エスケープ必要とするかもしれない限り除き、引用またはエスケープ必要はありません。

+0

私は、コマンドを文字列のパラメータと一緒に渡す必要がありますが、私はあなたの提案を賞賛しています。ありがとう! – Bera

+0

私は持っている! "./command.sh \ "\"" + "\\\\\\\" PARAM_1 \\\\\\\ "" + \t \t "\\\\\\\" PARAM_2 \\\\\ \\ "" + \t \t "\" \ ""; – Bera

5

ProcessBuilderを使用してください。特別な必要はありません、彼らはちょうどを通じてトリックルします。

test.shで
//ProcessBuilder pb = new ProcessBuilder("test.sh", "param1", "param2", "param3"); 
ProcessBuilder pb = new ProcessBuilder("test.sh", "param1 " + "param2 " + "param3"); 
pb.start(); 

:program2.javaで

java -jar program2 $1 # Or however you want to call it. 

public static void main(String[] args) 
{ 
    System.out.println(args[0]); 
} 
+0

Jonathon Than so much so。しかし、私はshプログラムの方法を変更することはできませんまたは他のJavaアプリケーション引数を受け取ります。 1つの議論だけが移転されるべきです。 Thx – Bera

+0

@Bera私は答えを更新しました - あなたがそれを試してみるとどうなりますか?私は引数を単一のパラメータとして送信することを期待しています。 –