2008-08-25 11 views

Antwort

75

Erstellen Sie eine eigene Funktion zum Ausführen eines OS command über die command line?

Für ein Beispiel. Aber wissen Sie, wo und warum Sie dies verwenden möchten, wie andere es bemerken.

public static void main(String arg[]) throws IOException{ 
    Runtime runtime = Runtime.getRuntime(); 
    Process proc = runtime.exec("shutdown -s -t 0"); 
    System.exit(0); 
} 
+88

+1 nichts mehr Java als dieser Linie ist - Runtime runtime = Runtime.getRuntime(); – BRampersad

+2

Funktioniert das nur unter Windows oder überall? –

+4

Dies funktioniert nur unter Windows. – partlov

22

Die schnelle Antwort ist nein. Sie können dies nur tun, indem Sie die betriebssystemspezifischen Befehle aufrufen, die zum Herunterfahren des Computers führen, vorausgesetzt, Ihre Anwendung verfügt über die erforderlichen Berechtigungen. Dies ist inhärent nicht portabel, so dass Sie entweder wissen müssen, wo Ihre Anwendung ausgeführt wird, oder ob Sie unterschiedliche Methoden für verschiedene Betriebssysteme haben und welche Sie verwenden müssen.

2

Sie können JNI verwenden, um es so zu machen, wie Sie es mit C/C++ machen würden.

71

Hier ist ein weiteres Beispiel, das plattformübergreifende funktionieren könnte:

public static void shutdown() throws RuntimeException, IOException { 
    String shutdownCommand; 
    String operatingSystem = System.getProperty("os.name"); 

    if ("Linux".equals(operatingSystem) || "Mac OS X".equals(operatingSystem)) { 
     shutdownCommand = "shutdown -h now"; 
    } 
    else if ("Windows".equals(operatingSystem)) { 
     shutdownCommand = "shutdown.exe -s -t 0"; 
    } 
    else { 
     throw new RuntimeException("Unsupported operating system."); 
    } 

    Runtime.getRuntime().exec(shutdownCommand); 
    System.exit(0); 
} 

Die spezifischen Shutdown-Befehle erfordern unterschiedliche Pfade oder Administratorrechte

.

+0

Mein einziges Problem damit ist die Zukunft. Was passiert, wenn eine andere Art von Betriebssystem herauskommt und jemand eine JVM dafür macht? – Supuhstar

+15

dann fügen Sie die neue Bedingung ... Software ist nie fertig. – Gubatron

5

Bessere Nutzung .startsWith als die Verwendung .equals ...

String osName = System.getProperty("os.name");   
if (osName.startsWith("Win")) { 
    shutdownCommand = "shutdown.exe -s -t 0"; 
} else if (osName.startsWith("Linux") || osName.startsWith("Mac")) { 
    shutdownCommand = "shutdown -h now"; 
} else { 
    System.err.println("Shutdown unsupported operating system ..."); 
    //closeApp(); 
} 

funktionieren

Ra.

+22

Bis jemand ein neues Betriebssystem namens Macaroni verwendet, bei dem shutdown der Befehl self-destruct ist. –

8

Ich benutze dieses Programm, um den Computer in X Minuten herunterzufahren.

public class Shutdown { 
    public static void main(String[] args) { 

     int minutes = Integer.valueOf(args[0]); 
     Timer timer = new Timer(); 
     timer.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       ProcessBuilder processBuilder = new ProcessBuilder("shutdown", 
         "/s"); 
       try { 
        processBuilder.start(); 
       } catch (IOException e) { 
        throw new RuntimeException(e); 
       } 
      } 

     }, minutes * 60 * 1000); 

     System.out.println(" Shutting down in " + minutes + " minutes"); 
    } 
} 
1

Unter Windows Embedded standardmäßig gibt es keinen Befehl zum Herunterfahren in cmd. In diesem Fall müssen Sie diesen Befehl manuell hinzufügen oder verwenden Sie die Funktion ExitWindowsEx von win32 (user32.lib) mit JNA (wenn Sie mehr Java wollen) oder JNI (wenn es einfacher für Sie sein wird, Privilegien in C-Code zu setzen).

27

Hier ist ein Beispiel unter Verwendung von Apache Commons Lang'sSystemUtils:

public static boolean shutdown(int time) throws IOException { 
    String shutdownCommand = null, t = time == 0 ? "now" : String.valueOf(time); 

    if(SystemUtils.IS_OS_AIX) 
     shutdownCommand = "shutdown -Fh " + t; 
    else if(SystemUtils.IS_OS_FREE_BSD || SystemUtils.IS_OS_LINUX || SystemUtils.IS_OS_MAC|| SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_NET_BSD || SystemUtils.IS_OS_OPEN_BSD || SystemUtils.IS_OS_UNIX) 
     shutdownCommand = "shutdown -h " + t; 
    else if(SystemUtils.IS_OS_HP_UX) 
     shutdownCommand = "shutdown -hy " + t; 
    else if(SystemUtils.IS_OS_IRIX) 
     shutdownCommand = "shutdown -y -g " + t; 
    else if(SystemUtils.IS_OS_SOLARIS || SystemUtils.IS_OS_SUN_OS) 
     shutdownCommand = "shutdown -y -i5 -g" + t; 
    else if(SystemUtils.IS_OS_WINDOWS_XP || SystemUtils.IS_OS_WINDOWS_VISTA || SystemUtils.IS_OS_WINDOWS_7) 
     shutdownCommand = "shutdown.exe -s -t " + t; 
    else 
     return false; 

    Runtime.getRuntime().exec(shutdownCommand); 
    return true; 
} 

Diese Methode berücksichtigt eine ganze Menge mehr Betriebssysteme als eine der oben genannten Antworten. Es sieht auch viel schöner aus und ist zuverlässiger als die Überprüfung der os.name Eigenschaft.

Bearbeiten: Es hat jetzt die Option für den Benutzer, eine Verzögerung einzugeben, wenn sie möchten!

+0

Vielen Dank das ist sehr nützlich! Kennen Sie eine ähnliche Methode, einen Computer in jedem Betriebssystem zu schlafen? – JFreeman

+0

Auch ich frage mich, ob das für Windows 8+ funktioniert? – JFreeman

0

einfach einzelne Zeile

Runtime.getRuntime().exec("shutdown -s -t 0"); 

aber funktionieren nur auf Windows