6

本质上,我正在使用 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);
}

有没有办法通过这个“按任意键”的事情,无论是官方解决方案还是绕过?

4

6 回答 6

2

正如我在评论中所说,您可能会一直听InputStream直到“按任意键”。然后你应该通过OutputStream. 这里有一些代码可以帮助你:

   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 提要,直到程序完成。例如,您可以每秒写入 newLine 直到进程停止。就像是 :

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

您可以启动一个写入进程的线程,并在p.waitFor()返回时停止它。您也应该更改条件,以获得更干净的内容,例如每秒或线程未停止时。请注意,如果您正在写入流并且过程完成,您将有 IOException。这真的不是我会依赖的东西,但如果它可以帮助你。

于 2013-08-01T14:52:54.123 回答
1

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

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

于 2013-08-01T14:04:14.360 回答
1

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

在 CMD 中,将 ENTER 键通过管道传递给 RootKitRemover.exe

echo ^M|RootkitRemover.exe /noupdate

[编辑]

隐藏窗口,请使用/min开关(或/b表示根本没有窗口)启动 CMD 。

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.");
    }
}
于 2013-08-01T14:38:29.830 回答
0

您可以尝试在waitFor().

p1.getOutputStream().write((int)'\n');
于 2013-08-01T14:02:32.587 回答
0

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

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

于 2013-08-01T14:03:49.483 回答
0

根据这里添加/C可能会有所帮助。

执行字符串指定的命令,然后终止

/K是不是相反。

"RootkitRemover.exe /C /noupdate"
于 2013-08-01T14:04:01.950 回答