1. 程式人生 > >使用java程式碼呼叫exe程式 (包括引數傳遞)

使用java程式碼呼叫exe程式 (包括引數傳遞)

使用Java程式碼呼叫exe

1使用場景

      我現在使用eclipse+tomcat的架構建立了web server, 在這個web project中我需要建立一個定時任務,在定時任務中執行本地的一個C#工程生成的exe。

2Java程式碼

public class MyTask extends TimerTask {

  public void run() {
     System.out.println("call at " + (new Date()));
    // TODO æ­¤å¤„æ·»åŠ å…·ä½“ä»»åŠ¡ä»£ç  
     try {
         String cmdStr1="D:/download/SvmGridParameterTraining/SvmGridParameterTraining/EasySvmTrain/bin/Debug/EasySvmTrain newtrain.txt newtest.txt";
        
         
         Runtime.getRuntime().exec("cmd.exe /c start "+cmdStr1);
     }catch(Exception e){
         e.printStackTrace();
     }
  }

}

getRuntime().exec()中的引數包括exe檔案全路徑和引數 (我後面的兩個txt引數直接寫在後面即可)

/c 的意思是執行之後關閉命令列。

3陷阱:exe工作路徑

按以上程式碼執行後,發現程式並沒有按預期執行。 經過測試發現 作為引數的newtrain.txt 和newtest.txt 為空。 所以我分析在程式的執行路徑下並沒有這兩個檔案

在呼叫的C#程式中加入如下程式碼:

Headache 2014/8/29 13:28:11
 Console.WriteLine("Environment.CurrentDirectory:" + Environment.CurrentDirectory);
 Console.WriteLine("Directory.GetCurrentDirectory():" + Directory.GetCurrentDirectory());
 String input2 = Console.ReadLine();

打印出專案的工作目錄,可以發現。在單獨呼叫C#工程時,工作目錄為C#的工程目錄,而使用tomcat +eclipse 做定時任務時, 打印出的目錄是tomcat的目錄。

因為源程式需要使用的newtrain和newtest檔案都在C#目錄下, 所以通過java呼叫時傳進去的newtrain 和 newtest這兩個引數實際上是沒什麼意義的(tomcat下並沒有這兩個檔案)

4解決方式 

根據打印出的當前工作目錄, 把引數檔案放到相應的目錄下。