如何在exec运行时命令后停止java挂起

时间:2014-08-31 07:42:45

标签: java powershell batch-file

我已经在stackoverflow和google中寻找了解决这个问题的解决方案但是我没有找到任何可以帮助我解决它的实体。

我正在尝试使用PowerShell命令执行bat文件,然后将响应存储在StringBuilder中,但应用程序只是挂起。这就是我所做的

------ BATCH FILE ------------

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

------ JAVA FILE -------------

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;
    }
}

提前谢谢

2 个答案:

答案 0 :(得分:1)

您正尝试从网络共享执行批处理文件。即使从命令行执行,操作也可能因网络问题而挂起。变体假设是命令期望用户输入,例如网络共享的凭证。可能存在仅在通过Java运行时才显示此行为的条件。

为了更深入地了解发生的事情,我建议打印出您设法阅读的每个字符(后跟System.out.flush()),以及将标准输出和错误合并到Java中观察到的单个流中。请参阅ProcessBuilder的文档,了解如何实现这一目标。

答案 1 :(得分:0)

问题是你从流中读取整行...

尝试读取int值,因为它不能保证返回整行......

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

得到了这个答案