2014-11-07 143 views
0

我想以編程方式運行.exe程序(如果它尚未運行)。 目前我使用進程生成器從java啓動.bat。批處理文件在檢查它是否正在運行後運行.exe。 問題是,java將不會繼續,直到用戶關閉.exe程序。我該如何解決這個問題?從java運行一個.exe文件並繼續運行

Java代碼:

try { 
     ProcessBuilder builder = new ProcessBuilder("open.bat"); 
     final Process process = builder.start(); 
     InputStream is = process.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     while ((br.readLine()) != null) { 
     } 
     System.out.println("command line terminated"); 
    } catch (Exception err) { 
     err.printStackTrace(); 
     System.out.println("error "); 
    } 

批號:(open.bat)

tasklist | find "illustrator.exe" 
if errorlevel 1 start "" "C:\Program Files (x86)\Adobe\Adobe Illustrator CS6\Support Files\Contents\Windows\illustrator.exe" 
+0

創建一個新的主題? – 2014-11-07 00:30:11

+1

將'while((br.readLine())!= null){'移動到另一個線程,讓它靜靜地消耗結果,這將允許剩下的代碼,記住,IO往往是阻塞的,所以循環;) – MadProgrammer 2014-11-07 00:30:27

+1

你得到「命令行終止」的輸出嗎?破壞你的進程 – 2014-11-07 00:34:19

回答

1

更新

使用...

start "" "C:\Program Files (x86)\Adobe\Adobe Illustrator CS4\Support Files\Contents\Windows\illustrator.exe" 

由於open.bat批處理文件,並使用...

try { 
    ProcessBuilder builder = new ProcessBuilder("open.bat"); 
    builder.redirectError(); 
    builder.inheritIO(); 
    final Process process = builder.start(); 
    final InputStream is = process.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr); 
    String text = null; 
    while ((text = br.readLine()) != null) { 
     System.out.println(text); 
    } 

    System.out.println("command line terminated"); 
    System.out.println("Exited with " + process.waitFor()); 
} catch (Exception err) { 
    err.printStackTrace(); 
    System.out.println("error "); 
} 

我可以得到批處理文件來運行和終止,仍然有插圖的負載和運行。

主要增加的是呼叫ProcessBuilder#inheritIO,這確實有些神奇,我不知道,但似乎讓批處理文件終止......

JavaDocs

這給出的行爲與大多數操作系統命令解釋程序或標準C庫函數system()相當。

+0

好極了!有用。感謝MadProgrammer並感謝大家。 – Audrey 2014-11-07 01:25:24

+0

@Audrey是的,這是一個有趣的過山車騎「我不知道爲什麼這個作品,但它確實,所以不要想太久或它可能會停止」... ...同樣舊的,同樣的舊辦公室比;) – MadProgrammer 2014-11-07 01:27:53

+0

從API: pb.inheritIO() 的行爲完全相同的方式調用 pb.redirectInput(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .redirectError(重定向.INHERIT) – Audrey 2014-11-07 01:30:05