2017-05-19 7 views
0

自分のjar 3プログラムから独自のパラメータで起動します。 最初と2番目のプログラムは仕事をしますが、2番目のプログラムは実行しません。Javaコードからコマンドを実行しても動作しませんが、同じ文字列がcmd.exeによって手動で動作します

ここ

ここでコード

Runtime rt = Runtime.getRuntime(); 
String cmdGet= "something"; 
try { 
      infolog("Executing command: " + cmdGet); 
      rt.exec(cmdGet); 
     } 
     catch(Exception ex){ 
      infolog("Unable to launch program 2"); 
      saveLog(); 
     } 

ログで

D:\Root\Module\Translators\L2Fo\SE_Draft_Update.exe -se_file="F:\Disp\Stage\DC\Ude34ea24x591ecb1c412x\M8486.dft" -input_file="F:\Disp\Stage\DC\Ude34ea24x591ecb1c412x\result\AttributeFile_M8486.txt" -log_file="F:\Disp\Stage\DC\Ude34ea24x591ecb1c412x\result\SELogg_M8486.txt" 

何かのためのコマンド私は、適切なコマンドが起動見つけるが、私は、そのジョブが行われていないことがわかります。したがって、cmdプロンプトで文字列を手動でコピーすることによって動作します。

この後の3番目のプログラムも機能します。 私はなぜそれが理解できません。

+0

何を? –

+0

これは完全にはわかりませんが、プログラムを実行しようとしているパスに関連している可能性があります。 jarから実行するとうまく動作しない可能性があります。絶対パスでテストしてみてください – mavarazy

+0

この方法でもっと多くのコマンドを扱えば、問題はJavaコードと関係していない可能性があります。あなたは* 'cmd' *コマンドを投稿してみませんか? –

答えて

0

コマンドには、独自のcmd-shellが必要な場合があります。 その後、 "CMD.EXE/C"接頭辞を追加する必要がありました。このため、cmd-Windowで の 'something'行がうまく動作する理由があります。

if (b_shell == true) cmd = "CMD.EXE /C " + cmdstr; 
else     cmd = cmdstr; 
... 
rt.exec(cmd); 

私はラッパー・メソッドに引数としてb_shellを渡します。その答えを

public static void systemCall(String cmdstr,boolean b_shell,Path logfile) throws IOException 
+0

私はこの方法を試みたが、何もしていない。また、cmdをバッチファイルに渡してみましたが、何もありません(CMD.EXE/Cがある場合とない場合) – Noomak

+0

マニフェストによる管理者の許可を含むあらゆる種類のソリューションを試しました。既にexeを使用するために必要な特権)。私は今チェックしたことは、動的変数を持つコマンドは、質問が投稿されたとして動作しませんが、javaコード内の静的な文字列と同じコマンドが動作します!ログ、だから私はそれが大丈夫だと思う – Noomak

0

申し訳ありませんが、おそらくあなたは終了コマンドを待つことができていると返し バージョンを試してみたいですコマンドの出力をArrayListとして出力します。

/** 
* Executes command 'cmdstr'. The output of the command is stored in a ArrayList-String array 
* @param cmdstr The command line to be executed not containing a redirect to an outputfile (> x.txt) 
* @param b_wait If true the command waits until it is finished and 'errmsg' contains the exit value 
* @param b_shell If true the command will be started in a shell (uses prefix CMD.EXE /C) 
* @param errmsg OUT: Error message 
* @return ArrayList-String output or null on error, see errmsg 
* @since Last change: 2014.04.30   
*/ 
public static ArrayList<String> systemCallOutputArray(String cmdstr,boolean b_wait,boolean b_shell,/*IO*/StringBuffer errmsg) 
{ 
final String fn="systemCallOutputArray()"; 
    errmsg.setLength(0); 
    if (cmdstr == null || cmdstr.isEmpty()) { errmsg.append(fn + ": Invalid arg. 'cmdstr' (null or empty)"); return null; } 

    ArrayList<String> output = new ArrayList<String>(); 
    String cmd =""; 

try 
{ 
    int exit_value = -1; 
    Runtime r = Runtime.getRuntime(); 
    Process p = r.exec(cmd); 

    String line=""; 
    if (b_wait == true) 
    {  
     p.waitFor(); // waits until prozess is terminated, throws InterruptedException if wait is interrupted  

     exit_value = p.exitValue(); 

     BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));  
     while ((line = input.readLine()) != null) 
     { if (line.isEmpty() == false) output.add(line); 
     }  
     input.close(); 
     return output;   
    } 
    // the following lines are for b_wait = false 

    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));  
    while ((line = input.readLine()) != null) 
    { if (line.isEmpty() == false) output.add(line); 
    }  
    input.close();  
    return output;    
} 
catch (Exception e) 
{ 
    errmsg.append(fn + " failed: " + e.toString() + " cmd: '" + cmd + "'"); 
    return null; 
}  
} //---------------- end of systemCallOutputArray() 
0

あなたはこれを試してみたいことがあります:例外のスタックトレースで

public class testProcess { 

static String cmdGet = "D:\\Root\\Module\\Translators\\L2Fo\\SE_Draft_Update.exe -se_file=\"F:\\Disp\\Stage\\DC\\Ude34ea24x591ecb1c412x\\M8486.dft\" " 
     + "-input_file=\"F:\\Disp\\Stage\\DC\\Ude34ea24x591ecb1c412x\\result\\AttributeFile_M8486.txt\" " 
     + "-log_file=\"F:\\Disp\\Stage\\DC\\Ude34ea24x591ecb1c412x\\result\\SELogg_M8486.txt\""; 


public static void main(String[] args) { 
    run(); 

} 

public static void run() { 
    try { 
    Process p = Runtime.getRuntime().exec(cmdGet); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

関連する問題