基本上,我正在使用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);
}
有没有办法解决这个“按任意键”的问题,无论是官方解决方案还是旁路?
答案 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()
编辑:
如果您没有获得任何输出,您只需尝试发送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)