2013-08-01 14 views
5

Zasadniczo uruchamiam ciche skanowanie linii poleceń za pomocą Java. Następnie czekam na zakończenie skanowania i zamknięcie procesu przed przejściem dalej. Jednak proces nie kończy się, dopóki "Naciśnij dowolny klawisz, aby kontynuować". Inną rzeczą, na którą należy zwrócić uwagę, jest to, że okno wiersza poleceń nie jest widoczne w tym czasie, co jest zamierzone, więc proces pozostaje aktywny w tle, bezczynny, po zakończeniu skanowania. Oto fragment kodu:"Naciśnij dowolny klawisz, aby kontynuować" wstrzymuje mój program

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

Czy istnieje jakiś sposób na uzyskanie przez ten „Naciśnij dowolny klawisz” rzeczy, czy to oficjalne rozwiązanie czy tylko obejście?

+1

Twoja odpowiedź będzie dotyczyła opcji wiersza poleceń dla RootKitRemover.exe. Domyślam się, że samo to polecenie kończy się komunikatem "naciśnij dowolny klawisz, aby kontynuować". Podczas wykonywania go za pomocą metody exec jego działanie jest zasadniczo takie samo, jak w przypadku wykonywania go za pomocą wiersza polecenia: –

+0

http://stackoverflow.com/a/755568/1654265 –

+0

Niestety, nie ma tu rozwiązania w ramach opcji wiersza poleceń. Niestety, programowi brakuje obszernej bazy opcji poleceń, co jest dość zabawne, ponieważ jest to program linii poleceń. – JTApps

Odpowiedz

2

Jak powiedziałem w moim komentarzu, prawdopodobnie można słuchać InputStream aż „Naciśnij dowolny klawisz”. Następnie powinieneś napisać nową Linię do procesu poprzez OutputStream.Oto kod, aby pomóc:

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

Niektóre uwaga na kodzie:

  • należy zmienić wyjątek zarządzający bo jestem po prostu robi e.printStackTrace()
  • mój proces jest okno poleceń, nie wiem, czy to będzie działać dla exe

Edit:

Jeśli nie uzyskujesz żadnych danych wyjściowych, możesz po prostu spróbować wysłać kanały newLine do czasu zakończenia programu. Można na przykład napisać nową linię co sekundę, aż proces się zatrzyma. Coś jak:

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

Można zacząć wątek, że pisanie do procesu i zatrzymać go, gdy zwrot p.waitFor(). Powinieneś również zmienić ten stan, aby coś bardziej czystego, jak każda sekunda lub gdy wątek nie jest zatrzymany. Pamiętaj, że będziesz mieć wyjątek IOException, jeśli piszesz do strumienia i proces się kończy. A to naprawdę nie jest coś, na czym mógłbym polegać, ale jeśli mogłoby ci pomóc.

+0

Zanim zapełnię to wszystko, zacznę od sprawdzenia, czy mogę najpierw pobrać strumień wyjściowy, aby zalogować się do mojej konsoli, a następnie pracować nad jego odczytaniem. – JTApps

+0

@JTApps Jeśli chcesz zobaczyć dane wyjściowe w swoim protokole, możesz usunąć część 'if' i wypisać' line' w swoim loginie –

+0

Próbuję tego i nie otrzymuję żadnego wyjścia. Zasadniczo po prostu zgrałem środkową część kodu, jak widać tutaj: http://pastebin.com/raw.php?i=d7wFadYR – JTApps

0

Możesz spróbować po prostu napisać nowy znak linii do strumienia wyjściowego procesu przed waitFor().

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

Nie można pisać w InpuStream. – Azad

+0

Miałem na myśli wyjście ... – ejk314

+0

Usunięto zagłosowanie. – Azad

0

Czy próbowałeś umieścić System.exit() gdzieś na końcu kodu?

Chciałbym zacząć od próby ustalenia, czy proces pokazujący „Naciśnij dowolny klawisz” wiadomość pochodzi z procesu Java lub podstawowa wykonywalny (RootkitRemover)

+0

Z pewnością jest to plik wykonywalny w tym przypadku. – JTApps

0

Według here dodając /C może pomóc.

Wykonuje polecenie określone przez ciąg znaków, a następnie kończy

/K jest jego przeciwieństwem.

"RootkitRemover.exe /C /noupdate" 
+0

EDYCJA: Nie działa. Przepraszam. – JTApps

+1

Ta opcja wiersza poleceń jest dla wiersza polecenia systemu Windows ('cmd') sama w sobie –

1

można uzyskać OutputStream procesu, a następnie monitorować wyjście z procesu i naciśnij dowolny klawisz, gdy pojawia się wtedy napisać do InputStream.

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

+0

Wydaje się, że to możliwe, ale nie jestem pewien, co dokładnie mówisz. Czy mogę zrobić coś takiego jak ... 'System.out.println (p1.getOutputStream());'? EDIT: Fun fakt, który zwraca 'java.io.BufferedOutputStream @ 2a8ceeea' – JTApps

+0

Podczas pętli nad outputstream wywoływanie next i hasNext, dopóki nie otrzymasz znaków, które chcesz" naciśnij dowolny klawisz, aby kontynuować ". Następnie wprowadź znak do strumienia wejściowego. –

+0

W porządku, teraz ma to dla mnie sens. Jedyny problem, jaki mam teraz, polega na zwrocie tekstu ze strumienia wyjściowego, aby rozpocząć sprawdzanie znaków, które chcę. Nie mogę oczywiście uzyskać poprawnej składni i szukanie w Internecie oferuje pomoc przy drukowaniu do konsoli programowej, a nie z wiersza poleceń do konsoli programowej. – JTApps

1

pomysł ... Zamiast wywoływać bezpośrednio RootkitRemover.exe, zawiesić połączenie w pliku CMD (rootkitremover.cmd).

w kierunku CMD, ty rury klucza ENTER RootKitRemover.exe

echo ^M|RootkitRemover.exe /noupdate 

[Edycja]

do ukryć okno uruchomić CMD z /min przełącznika (lub /b bez okna).

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."); 
    } 
} 
+0

Mam wrażenie, że spowoduje to pojawienie się okna, czego dokładnie nie chcę. Spróbuję, bo nigdy tego nie wiesz. EDYCJA: Miałem rację, niestety. – JTApps

Powiązane problemy