2014-08-31 113 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的文档以了解如何实现该目标。