2011-08-18 10 views
32

W języku Java chcę mieć możliwość wykonywania komend systemu Windows.Wykonywanie poleceń systemu Windows za pomocą języka Java - zmiana ustawień sieciowych

Dana komenda to netsh. Umożliwi mi to ustawienie/zresetowanie mojego adresu IP.

Należy zauważyć, że nie chcę wykonywać pliku wsadowego.

Zamiast używać pliku wsadowego, chcę wykonać takie polecenia bezpośrednio. czy to możliwe?


Oto moja wdrożone rozwiązanie na przyszłość:

public class JavaRunCommand { 
    private static final String CMD = 
     "netsh int ip set address name = \"Local Area Connection\" source = static addr = 192.168.222.3 mask = 255.255.255.0"; 
    public static void main(String args[]) { 

     try { 
      // Run "netsh" Windows command 
      Process process = Runtime.getRuntime().exec(CMD); 

      // Get input streams 
      BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream())); 

      // Read command standard output 
      String s; 
      System.out.println("Standard output: "); 
      while ((s = stdInput.readLine()) != null) { 
       System.out.println(s); 
      } 

      // Read command errors 
      System.out.println("Standard error: "); 
      while ((s = stdError.readLine()) != null) { 
       System.out.println(s); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(System.err); 
     } 
    } 
} 
+1

zostało odpowiedział tak wiele razy. Wystarczy spojrzeć na sugestie StackOverflow znaleźć niektóre z nich – SJuan76

+0

@ SJuan76, Przepraszam. mógłbyś mi może połączyć niektóre z tych pytań? – mre

+1

@mre Wystarczy spojrzeć na pasku bocznym. –

Odpowiedz

25
Runtime.getRuntime().exec("netsh"); 

Zobacz Runtime Javadoc.

EDYCJA: Późniejsza odpowiedź leet sugeruje, że ten proces jest teraz przestarzały. Jednak, jak na komentarz DJViking, wydaje się, że tak nie jest: Java 8 documentation. Ta metoda nie jest przestarzała.

+2

W moim enviro Musiałem dodać polecenie "cmd/c", tj. 'Runtime.getRuntime(). exec (" cmd/c netsh ");' – Daniel

2
public static void main(String[] args) { 
    String command="netstat"; 
    try { 
     Process process = Runtime.getRuntime().exec(command); 
     System.out.println("the output stream is "+process.getOutputStream()); 
     BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String s; 
     while ((s = reader.readLine()) != null){ 
      System.out.println("The inout stream is " + s); 
     }     
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

To działa.

+1

To czyta co drugą linię danych wyjściowych. Powinno być: 'String s; while ((s = reader.readLine()! = Null) { System.out.println (s); } ' –

+0

' while ((s = reader.readLine())! = Null) {'jest poprawne – SuB

26

Zastosowanie ProcessBuilder

ProcessBuilder pb=new ProcessBuilder(command); 
pb.redirectErrorStream(true); 
Process process=pb.start(); 
BufferedReader inStreamReader = new BufferedReader(
    new InputStreamReader(process.getInputStream())); 

while(inStreamReader.readLine() != null){ 
    //do something with commandline output. 
} 
+5

Co jest podstawą tego wniosku? Patrząc na javadoc, nie jest on zadeklarowany jako przestarzały. -java.lang.String- – DJViking

+0

Aktualizowanie: Ponieważ to pytanie jest używane jako odniesienie podczas oznaczania duplikatów (tj. wskazujemy duplikaty na tej stronie), byłoby miło wyjaśnić tę odpowiedź, która ma więcej upvotes, że akceptowane Odpowiedź Czy istnieje źródło dla tych informacji? Jeśli nie, może powinien zostać usunięty jako odpowiedź wyginająca? – Nathan

+2

'Runtime.getRuntime(). exec()' nie jest przestarzałe. – Daniel

0

można uruchomić komendę Runtime.getRuntime().exec("tree");. Ale to będzie działać tylko pliki wykonywalne znalezione w ścieżce, a nie polecenia jak echo, del ... ale tylko rzeczy jak tree.com, netstat.com ... Aby uruchomić regularne komendy, trzeba będzie umieścić cmd /c przed poleceń (eaxmple: Runtime.getRuntime().exec("cmd /c echo echo");

Powiązane problemy