与命令行进程交互

时间:2012-09-02 21:40:58

标签: java windows process

我需要与命令行进程进行交互,例如windows上的diskpart。问题:以下示例中的input.readLine()会导致阻止。

public static void main(String[] args) throws IOException 
{
    ProcessBuilder processBuilder = new ProcessBuilder("C:\\Windows\\system32\\diskpart.exe");                      
    processBuilder.redirectErrorStream(true);
    Process process = processBuilder.start();

    input = new BufferedReader(new InputStreamReader(process.getInputStream()));
    output = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));

    // read #1 code position
    String line = null;
    while((line = input.readLine())!= null)
        System.out.println(line);

    // code position #2
    System.out.println("This line is never executed");   

    output.write("list disk" + System.lineSeparator());
    output.flush(); // important
}

输出(来自读取#1代码位置)是

Microsoft DiskPart-Version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
Auf Computer: MYPC

这是正确的,但是之后没有任何反应,例如代码位置#2

System.out.println("This line is never executed"); 

永远不会到达。谁能告诉我,为什么以及如何解决这个问题?谢谢!

更新

尝试逐字节读取似乎也不起作用? ):

    InputStreamReader input = new InputStreamReader(process.getInputStream());
    int mychar = -1;

    while((mychar = input.read()) != -1)
        System.out.println(mychar);

    System.out.println("This line is never executed"); 

2 个答案:

答案 0 :(得分:3)

因为Diskpart所做的下一件事是显示提示,其中不包含换行符:

Microsoft DiskPart version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: PCNAME

DISKPART> _

所以你的代码就在那里等待换行符,它永远不会出现。

您需要更改代码以在适当的时间发送“list disk”命令。

答案 1 :(得分:1)

Diskpart有一个交互式控制台,需要用户输入。试图读取它的输出:

while((line = input.readLine())!= null)
      System.out.println(line);

将导致您无限期地等待,因为应用程序本身需要输入。

您需要先从windows命令等待输入,因此您需要在命令中添加 CMD /C

由于diskpart是交互式的,您可以尝试将list命令作为脚本运行,因此您可以改为:

String[] command = {"CMD", "/C", "C:\\Windows\\system32\\diskpart.exe", "/s", "diskpart.txt"};
ProcessBuilder processBuilder = new ProcessBuilder(command); 

diskpart.txt包含:

list disk

我建议您首先使用标准批处理文件,但要检查输出是否正确。