“按任意键继续”正在阻止我的程序

时间:2013-08-01 13:58:53

标签: java

基本上,我正在使用Java运行静默命令行扫描。然后,我等待此扫描完成,然后关闭该过程,然后再继续。但是,在您“按任意键继续”之前,该过程不会结束。另外需要注意的是,命令行窗口当时是不可见的,因此,一旦扫描完成,该过程就会在后台保持活动状态,空闲。以下是代码片段:

Main.print("Performing RKR Scan...");
try {
    Process p1 = Runtime.getRuntime().exec(dir + "RootkitRemover.exe /noupdate"); 
    try {
        p1.waitFor();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
} catch (IOException e) {
    Main.print("Error Scanning With RKR: " + e);
}

有没有办法解决这个“按任意键”的问题,无论是官方解决方案还是旁路?

6 个答案:

答案 0 :(得分:2)

正如我在评论中所说,你可以听到InputStream直到"按任意键"。然后你应该通过OutputStream在流程中写一个newLine。以下是一些可以帮助您的代码:

   public class BatchEnter {

    public static void main(String[] args) throws Exception {
        List<String> params = Arrays.asList(new String[] { "cmd", "/C", "C:/test/test.bat" });
        ProcessBuilder builder = new ProcessBuilder(params);
        builder.directory(new File("C:/test")).redirectErrorStream(true);
        final Process p = builder.start();

        final BufferedReader wr = new BufferedReader(new InputStreamReader(p.getInputStream()));
        final BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(p.getOutputStream()));
        String line = "";
        try {
            while ((line = wr.readLine()) != null) {
                if (line.equals("Press any key")) {
                    String newLine = "\n\r";
                    writer.write(newLine);

                }
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        p.waitFor();
    }
}

关于代码的一些评论:

  • 您应该更改异常管理原因我只是e.printStackTrace()
  • 我的流程是一个命令窗口,我不知道它是否适用于您的exe

编辑:

如果您没有获得任何输出,您只需尝试发送newLine供稿,直到程序结束。你可以为exemample,每秒写一次newLine,直到进程停止。类似的东西:

final BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(p.getOutputStream()));
    while(true){
        String newLine = "\n\r";
        writer.write(newLine);
    }

您可以启动一个写入进程的线程,并在p.waitFor()返回时停止它。您也应该更改条件,比如每秒更清洁或线程没有停止。请注意,如果您正在写入流并且流程完成,则会出现IOException。这真的不是我会依赖的东西,但如果它可以帮助你。

答案 1 :(得分:1)

你能获得进程的输出流,然后监视进程的输出,当按任意键时,然后写入输入流。

http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html

答案 2 :(得分:1)

一个想法......不是直接调用RootkitRemover.exe,而是将调用放在CMD文件(rootkitremover.cmd)中。

在CMD中,您将一个ENTER键传递给RootKitRemover.exe

echo ^M|RootkitRemover.exe /noupdate

[编辑]

隐藏窗口,请使用 / min 开关启动CMD(或 / b 完全没有窗口)。

import java.io.IOException;

public class Testing {

    /**
     * @param args
     * @throws IOException 
     * @throws InterruptedException 
     */
    public static void main(String[] args) throws IOException, InterruptedException {
        String fileName = "c:\\temp\\test.cmd";
        String[] commands = {"cmd", "/c", "start", "/min", "\"DummyTitle\"", fileName};
        Process p1 = Runtime.getRuntime().exec(commands);
        p1.waitFor();
        System.out.println("done.");
    }
}

答案 3 :(得分:0)

您可以尝试在waitFor()之前将新行char写入流程的输出流。

p1.getOutputStream().write((int)'\n');

答案 4 :(得分:0)

您是否尝试在代码末尾的某处放置System.exit()?

我首先尝试确定显示“按任意键”消息的进程是来自您的Java进程还是底层可执行文件(RootkitRemover)

答案 5 :(得分:0)

根据here 添加/C可能有所帮助。

  

执行string指定的命令,然后终止

/K是相反的。

"RootkitRemover.exe /C /noupdate"