2014-08-31 141 views
2

我在尋找解決方案在stackoverflow和谷歌這個問題,但我還沒有發現任何可以幫助我解決它的固體。如何在執行運行時命令後停止java掛起

我試圖用java的powershell命令執行bat文件,然後在StringBuilder中存儲響應,但應用程序只是掛起。這是我做了什麼

------批處理文件------------

Powershell /C "Get-WMIObject -class Win32_ComputerSystem | select username" 

------ Java文件----- --------

import java.io.InputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.BufferedWriter; 
import java.io.FileWriter; 

import java.util.*; 

//import org.apache.commons.exec.CommandLine; 
//import org.apache.commons.exec.DefaultExecutor; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     try { 
      String command = "cmd /C .\\scripts\\Get-Username.bat"; 

      System.out.println(executeCommand(command).toString()); 

     }catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static StringBuilder executeCommand(String command) 
    { 
     String line = null; 
     StringBuilder responseBuffer = new StringBuilder(); 
     try { 

      Process process = Runtime.getRuntime().exec(command); 

      BufferedReader inStreamReader = new BufferedReader(
       new InputStreamReader(process.getInputStream())); 

      while((line = inStreamReader.readLine()) != null){ 
       //System.out.println(line); 
       responseBuffer.append(line + "\n"); 
      } 


      process.getOutputStream().close(); 

     }catch(IOException ex) { 
      ex.printStackTrace(); 
     } 

     return responseBuffer; 
    } 
} 

預先感謝您

+0

它掛在哪裏?你有沒有在IDE調試器中查看它? – 2014-08-31 07:49:48

+0

@JimGarrison我不使用IDE。我使用ant和文本編輯器作爲我的構建工具。因爲我的筆記本電腦很古老,所以它沒有足夠的內存來正確運行IDE。 – user3860307 2014-08-31 07:54:58

+1

@JimGarrson糾正我,如果我錯了,據我所知,似乎不去過去「while」聲明 – user3860307 2014-08-31 07:56:54

回答

0

的問題是,你從流讀取整行...

嘗試閱讀int類型,因爲它沒有瓜爾anteed返回一整行...

int sign = 0; 
while(sign != -1){ 
    sign = process.getInputStream().read(); 
    char c = (char)sign; 
    System.out.print(""+c); 
} 

我從http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#start%28%29

+1

謝謝,我會給那一個嘗試。 – user3860307 2014-08-31 08:00:41

+1

對不起,這沒有奏效,它仍然掛起。不再有想法,你想分享 – user3860307 2014-08-31 08:11:19

+0

你有沒有單獨閱讀或結合你以前的代碼? – 2014-08-31 08:20:51

1

您正在嘗試從網絡共享執行批處理文件這個答案。由於網絡問題,該操作可能會掛起,即使從命令行執行。變體假設是,該命令期望用戶輸入,例如網絡共享的憑證。只有在通過Java運行時纔會出現此行爲。

爲了更好地瞭解發生的事情,我建議打印出您設法閱讀的每個字符(後面跟着System.out.flush()),並將標準輸出和錯誤合併到Java中觀察到的單個流中。請參閱ProcessBuilder的文檔以瞭解如何實現該目標。