# Datei öffnen - cmd.exe



## StickToFreak (18. Apr 2009)

Hey Leute,

Manche von euch kennen bestimmt folgendes Problem:

Es ist abends, ihr seit irgendwas am downloaden und das ganze dauert noch eine Stunde 37 Minuten und 40 Sekunden. Man will aber ins Bett. Also geht man auf Ausführen, cmd.exe, shutdown -s -t xxx . So Jetzt muss man diese 1h 37min 40sec noch in Sekunden umrechnen. Das ganze geht mir langsam auf die Nerven. . Ich weiß ich hab Probleme ~.~. Egal. Auf jedenfall wollte ich dann dazu etwas schreiben:

Ich hab ein Applet gemacht mit 3 Kästchen für Sekunden, Minuten und Stunden. Diese Daten trägt man ein (in dem Falle 1h 37min und 40 sec). Das ganze wird zack ausgerechnet ( 1*3600, 37*60, 40*1 um von jeden die sekunden zu bekommen). Dann hab ich zwei Buttons. Einen zum abbrechen des Shutdowns, falls es doch länger dauert und einen zum Starten. Wenn man jetzt auf den "Start" klickt soll sich, unsichtbar oder nicht, "cmd.exe" öffnen bzw die normale cmd Konsole und dort hineinschreiben -was ich schon in einem String definiert habe: shutdown -s -t . Die Zeit wird dann per Variable der ausgerechneten Zeit angegeben. Also soll er das ganze ungefähr so schreiben: "shutdown -s -t "o. (o = die Variable für die Zeit in Sekunden). Soweit so gut, das ganze funktioniert aber nicht weil ich nicht weiß, wie man die cmd Konsole öffnen soll und das andere dann reingeschrieben werden soll. Ich hab schon Beiträge gelesen wie das Öffnen vom Desktop oder irgendwas mit "Process process = Runtime.....". Hab ich alles in irgendeiner Weise versucht umzusetzen, aber leider vergeblich^^ . Gut also ich hab hier jetzt mal den Code:


```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;

public class cmdtest extends Applet implements ActionListener, MouseListener {

	String befehl = "shutdown -s -t"; // zum starten der String
	String befehlstopp = "shutdown -a"; // zum stoppen der String
	String zeit;
	String input1;
	String input2;
	String input3;
	TextField feld1;
	TextField feld2;
	TextField feld3;
	Label la, lb, lc, ld, le, lf, lg;
	private int x, y, z, w, e, r;
	private int klick, inhalt1, inhalt2, inhalt3;
	double o;
	Button b1, b2;
	boolean i;

	public void init() {

		setLayout(null);

		ld = new Label();
		ld.setBounds(40, 20, 500, 20);
		ld.setText("Hier unten siehst du 3 Kästchen, trage folgendes ein:");
		add(ld);

		la = new Label();
		la.setBounds(100, 40, 500, 50);
		la.setText("Stunden");
		add(la);

		feld1 = new TextField();
		feld1.setBounds(40, 50, 30, 30);
		feld1.addActionListener(this);
		add(feld1);

		lb = new Label();
		lb.setBounds(100, 90, 500, 50);
		lb.setText("Minuten");
		add(lb);

		feld2 = new TextField();
		feld2.setBounds(40, 100, 30, 30);
		feld2.addActionListener(this);
		add(feld2);

		lc = new Label();
		lc.setBounds(100, 150, 500, 50);
		lc.setText("Sekunden");
		add(lc);

		feld3 = new TextField();
		feld3.setBounds(40, 160, 30, 30);
		feld3.addActionListener(this);
		add(feld3);

		le = new Label();
		le.setBounds(10, 220, 100, 30);
		le.setText("Dein PC fährt in");
		add(le);

		lf = new Label();
		lf.setBounds(250, 220, 100, 30);
		lf.setText("Minuten runter.");
		add(lf);

		lg = new Label();
		lg.setBounds(120, 225, 5000, 20);
		add(lg);

		b1 = new Button();
		b1.setBounds(260, 260, 100, 30);
		b1.setLabel("Shutdown now!");
		b1.addMouseListener(this);
		add(b1);

		b2 = new Button();
		b2.setBounds(140, 260, 100, 30);
		b2.setLabel("Stop Shutdown!");
		b2.addMouseListener(this);
		add(b2);

	}

	public void actionPerformed(ActionEvent e) {

		String input1 = feld1.getText();
		String input2 = feld2.getText();
		String input3 = feld3.getText();

		if (input1.length() == 0) {
			System.out.println("Keine Eingabe!");
		}
		if (input2.length() == 0) {
			System.out.println("Keine Eingabe!");
		}
		if (input3.length() == 0) {
			System.out.println("Keine Eingabe!");
		}

		int inputZahl1 = Integer.parseInt(input1);
		int inputZahl2 = Integer.parseInt(input2);
		int inputZahl3 = Integer.parseInt(input3);

		x = inputZahl1 * 3600;
		y = inputZahl2 * 60;
		z = inputZahl3 * 1;
		o = x + y + z;
		lg.setText(Double.toString(o / 60));

	}

	public void mouseClicked(MouseEvent f) {

		i = true;

		if (i == true) {

			// hier sollte das ganze dann eigentlich rein mit Konsole öffnen und
			// so...^^

		}

	}

	public void mouseExited(MouseEvent f) {

	}

	public void mouseEntered(MouseEvent f) {

	}

	public void mouseReleased(MouseEvent f) {
		i = true;
	}

	public void mousePressed(MouseEvent f) {

	}

}
```


----------



## faetzminator (18. Apr 2009)

Runtime (Java 2 Platform SE v1.4.2)
Allerdings wird das - wenn überhaupt - nur mit einem signierten Applett möglich sein.


----------



## StickToFreak (18. Apr 2009)

Diese Seiten hab ich mir alle schonmal angeguckt^^. Aber nie wirklich verstanden. Eine kleien hilfe wäre vllt. nett 

Danke


----------



## faetzminator (18. Apr 2009)

Was mir gerade einfiel: Noch einfacher: wenn du den Prozess nicht verwenden musst (stdin schreiben etc) kannst du einfach System.exec(befehl) aufrufen.


> Es ist abends, ihr seit irgendwas am downloaden und das ganze dauert noch eine Stunde 37 Minuten und 40 Sekunden. Man will aber ins Bett. Also geht man auf Ausführen, cmd.exe, shutdown -s -t xxx .


nö, kenn ich nicht


----------



## Empire Phoenix (18. Apr 2009)

Die simple Lösung:

Erstell eine bat datei die deinen job macht und speicher sie. (Dan musst du nur noch die bat aufrufen, must dich aber ncihtmehr um Parameter übergaben kümmern)

Die bat kann man jetzt wie aus meinen eiem Programm copiert starten:


```
protected static void StartGame(){
		allprogress.setIndeterminate(true);
		File scripFile = new File(installationfolder+ "/data/start.bat");
		try{
	        
	        ProcessBuilder processBuilder = new ProcessBuilder(scripFile.getAbsolutePath());
	        processBuilder.directory(scripFile.getParentFile());
	        processBuilder.start();
		} 
		catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			Thread.sleep(1000);
			scripFile.deleteOnExit();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		myself.dispose();
		System.exit(1);
	}
```


----------



## StickToFreak (18. Apr 2009)

Folgender Fehler tritt noch auf, wenn ich was falsch umgesetzt hab bzw kopiert habe bescheid sagen^^. 


```
cmdtest.java:162:5: cannot find symbol
symbol  : variable allprogress
location: class cmdtest
    allprogress.setIndeterminate(true);
    ^
cmdtest.java:163:5: cannot find symbol
symbol  : class File
location: class cmdtest
    File scripFile = new File("C:\\cmdtest\test.exe");
    ^
cmdtest.java:163:26: cannot find symbol
symbol  : class File
location: class cmdtest
    File scripFile = new File("C:\\cmdtest\test.exe");
                         ^
cmdtest.java:180:5: cannot find symbol
symbol  : variable myself
location: class cmdtest
    myself.dispose();
    ^
4 errors
```

Edit:

So siehts jetzt aus^^:

```
import java.applet.*;
      import java.awt.*;
      import java.awt.event.*;
      import java.io.IOException;


      
public class cmdtest extends Applet implements ActionListener,MouseListener
{

String befehl = "shutdown -s -t";      // zum starten der String
String befehlstopp = "shutdown -a";    // zum stoppen der String
String zeit;
String input1;
String input2;
String input3;
TextField feld1;
TextField feld2;
TextField feld3;
Label la,lb,lc,ld,le,lf,lg;
private int x,y,z,w,e,r;
private int klick,inhalt1,inhalt2,inhalt3;
double o;
Button b1, b2;
boolean i;




public void init()
  {
  
           setLayout(null);

ld = new Label();
ld.setBounds(40,20,500,20);
ld.setText("Hier unten siehst du 3 Kästchen, trage folgendes ein:");
add(ld);

la = new Label();
la.setBounds(100,40,500,50);
la.setText("Stunden");
add(la);

feld1 = new TextField();
feld1.setBounds(40,50,30,30);
feld1.addActionListener(this);
add(feld1);

lb = new Label();
lb.setBounds(100,90,500,50);
lb.setText("Minuten");
add(lb);

feld2 = new TextField();
feld2.setBounds(40,100,30,30);
feld2.addActionListener(this);
add(feld2);

lc = new Label();
lc.setBounds(100,150,500,50);
lc.setText("Sekunden");
add(lc);

feld3 = new TextField();
feld3.setBounds(40,160,30,30);
feld3.addActionListener(this);
add(feld3);

le = new Label();
le.setBounds(10,220,100,30);
le.setText("Dein PC fährt in");
add(le);

lf = new Label();
lf.setBounds(250,220,100,30);
lf.setText("Minuten runter.");
add(lf);

lg = new Label();
lg.setBounds(120,225,5000,20);
add(lg);

b1 = new Button();
b1.setBounds(260,260,100,30);
b1.setLabel("Shutdown now!");
b1.addMouseListener(this);
add(b1);

b2 = new Button();
b2.setBounds(140,260,100,30);
b2.setLabel("Stop Shutdown!");
b2.addMouseListener(this);
add(b2);


}

 public void actionPerformed(ActionEvent e)  {


    String input1 = feld1.getText();
    String input2 = feld2.getText();
    String input3 = feld3.getText();
    
   if(input1.length() == 0){
   System.out.println("Keine Eingabe!");
   }
    if(input2.length() == 0){
   System.out.println("Keine Eingabe!");
   }
   if(input3.length() == 0){
   System.out.println("Keine Eingabe!");
   }
   
    int inputZahl1 = Integer.parseInt(input1);
    int inputZahl2 = Integer.parseInt(input2);
    int inputZahl3 = Integer.parseInt(input3);

    x = inputZahl1*3600;
    y = inputZahl2*60;
    z = inputZahl3*1;
    o = x+y+z;
    lg.setText(Double.toString(o/60));
    


    

    
 }
 
 public void  mouseClicked(MouseEvent f) {

i=true;

            if(i==true){

               //hier sollte das ganze dann eigentlich rein mit Konsole öffnen und so...^^

            }


 }
 public void mouseExited(MouseEvent f){


 }
 
 public void mouseEntered(MouseEvent f){

 }
  public void mouseReleased(MouseEvent f){
           i=true;
 }
  public void mousePressed(MouseEvent f){

 }

protected static void StartGame(){

    allprogress.setIndeterminate(true);
    File scripFile = new File("C:\\cmdtest\test.exe");
    try{

          ProcessBuilder processBuilder = new ProcessBuilder(scripFile.getAbsolutePath());
          processBuilder.directory(scripFile.getParentFile());
          processBuilder.start();
    }
    catch (Exception e) {

      e.printStackTrace();
    }
    try {
      Thread.sleep(1000);
      scripFile.deleteOnExit();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    myself.dispose();
    System.exit(1);
  }



}
```


----------



## faetzminator (18. Apr 2009)

Da er dir nur irgendeinen Konstruktor kopiert hat, fehlen dir die Klassenvariablen


----------



## StickToFreak (18. Apr 2009)

Bedeutet?


----------



## Tomate_Salat (18. Apr 2009)

hmm schöne idee, die klau ich dir . Wenn ich vor dir fertig bin, poste ich den Quellcode gerne hier rein

*EDIT* ok, habs schon:


```
package sys;

import java.io.IOException;

public class Shutdown {
    // Main-Test-Methode
    public static void main(String[] args) {
        Shutdown sys    = new Shutdown();
        sys.setCountDown(1, 10, 10);
        sys.stop();
    }
    
    private boolean isSet = false;
    
    // Konstruktor
    public Shutdown() {
        
    }
    
    // Methoden
    public void setCountDown(int hours, int minutes, int seconds) {
        int gesamt = 0;
        
        // Sekunden ermitteln
        if(hours   != 0) gesamt += hours * 3600;
        if(minutes != 0) gesamt += minutes *60;
        if(seconds != 0) gesamt += seconds;
        
        // Wenn keine Daten übergeben worden sind
        if(gesamt == 0) return;
        
        // Wenn Process schon besteht
        if(isSet) return;
        
        ProcessBuilder builder  = new ProcessBuilder("cmd","/c","shutdown -s -t " + gesamt);
        Process process         = null;
        try {
            process = builder.start();
            isSet   = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(process != null) {
                process.destroy();
            }
        }
    }
    
    public void stop() {
        ProcessBuilder builder = new ProcessBuilder("cmd","/c","shutdown -a");
        Process process        = null;
        try {
            process = builder.start();
            isSet   = false;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(process != null) {
                process.destroy();
            }
        }
    }
    
    public boolean isSet() {
        return isSet;
    }
}
```

*EDIT 2* hab bisher wenig mit konsolen gearbeitet. Gibt es eine Möglichkeit, heraus zu finden, ob ein shutdown schon geplant wurde?


----------



## Empire Phoenix (19. Apr 2009)

hm ich weis nur das du die fürs abbrechen wenn der Process schon läuft mit einem zweiten shutdown -a abrrechen kannst, dannach kannst du dann wie gehabt den neuen Wert setzen. (Shutdown -a würde ich evtl einfach bei jedem Start des Programms ausführen, um sciherzustellen, das nicht bereits ein anderer läuft.


----------



## Tomate_Salat (19. Apr 2009)

das will ich ja _gerade nicht!_. Denn dann müsste man ja wieder einen neuen Wert setzten! Ich will aber wissen ob schon ein Prozess gesetzt wurde und wenn es so ist, soll der Benutzer informiert werden. Ein verwandter brachte mich auf die Idee: Da könnte ja ein Task gestartet werden, wenn man shutdown aktiviert....dem ist leider nicht so (ich habe ihn zumindest mal nicht gefunden). Werde jetzt mal nachschauen, ob vllt ein Dienst dadurch aktiviert wird.


----------



## Oscuro (8. Jan 2010)

@ Tomate_Salat

Ist dein letzter geposteter Quelltext das eigenständige "Programm", dass man dann aus Eclipse als "runnable jar file" exportieren und dann starten kann?
Oder ist das insgesamt nur die Methode, um die cmd aufzurufen, die man noch in ein anderes Programm einbinden muss?

Wäre toll wenn der Post nocht nicht verstaubt ist und noch eine Antwort kommt 

danke


----------



## Tomate_Salat (10. Jan 2010)

Ich hab den quelltext in einem Projekt aus meinem Blog-Eintrag benutzt. Das Projekt ist nach wie vor verfügbar, leider ist der Server recht unzuverlässig, ich habe aber eine Kopie davon auf meinem Rechner, notfalls kann ich es nochmal iwo anderster hochladen. 

Wenn dich der Source-Code interessiert, schaust du dir in dem Projekt am besten die Secure-Engine an. Ich habe diese als OpenSource gehalten und dort müssten auch die Shutdown-Befehle drinnen sein. Die Klassen kannst du gerne in eigenen Projekte verwenden, sollte es dir weiterhelfen


----------



## Oscuro (11. Jan 2010)

Vielen Dank schonmal.
Der Download hat sogar beim ersten Versuch geklappt :toll:

Wenn ich nun aber in deinem Programm z.B. 5 Sekunden angebe, tickt der Countdown runter, aber das System fährt nicht herunter, sondern der Countdown geht einfach in den negativen Bereich und zählt immer weiter.
Also 5,4,3,2,1,0,-1,-2-,3....

Hängt das nur an mir?


----------



## Tomate_Salat (11. Jan 2010)

das war glaub ich noch nicht bugfrei, aber es könnte an dir liegen, wenn du windows 7 oder windows vista benutzt. Den dort musst du das Programm als Admin ausführen, sonst hat es keinen Zugriff auf die Konsole und über die setzt es ja den shutdown befehl


----------



## Oscuro (11. Jan 2010)

Ich bin hier im Windows XP und habe nur teilweise Adminrechte.
In der Konsole kann ich die Befehle aber ausführen.

Ich werde es heute Abend dann auch mal noch zu Hause ausprobieren, da habe ich dann ja volle Admin Rechte


----------



## Tomate_Salat (11. Jan 2010)

ka wie es mit eingeschränkten rechten dann ausschaut. Ja teste es mal daheim, aber normal sollte das funktionieren^^


----------



## Oscuro (11. Jan 2010)

Okay, zu Hause tickt der Countdown auch in den negativen Bereich weiter :bahnhof:
Mit den Berechtigungen hats dann also mal nichts zu tun :/


----------



## Tomate_Salat (11. Jan 2010)

hmm ka, dann ists buggy.


----------



## Oscuro (12. Jan 2010)

Wenn es damals funktioniert hat und du zwischenzeitlich nichts am Code geändert hast, müsste es doch noch gehen :/


----------



## Tomate_Salat (12. Jan 2010)

sollte schon. So wie ich das sehe, hat er ein Problem mit der Countdown-prüfung aber die shutdown funktion an sich sollte funktionieren und um die geht es letztendlich. Leider habe ich das Hauptprogramm nicht OpenSource gehalten und deswegen kann ich den Fehler leider auch nicht mehr beheben.


----------



## Oscuro (12. Jan 2010)

Ich habe nun deinen Source Code etwas gekürzt und so Dinge wie "Zahleneingabe, Prozess Stoppen etc " weggemacht um den Code etwas zu vereinfachen.
Wenn ich nicht etwas primäres übersehe, müsste das System nun direkt runterfahren.
Wenn ich in cmd manuell "shutdown -s -t 0" eingebe, funktioniert das auch, jedoch nicht wenn ich im Eclipse die Klasse starte oder die Klasse als eigenständige .jar exportiere und vom Desktop starte ;(


```
package Shutdown;
 
import java.io.IOException;
 
public class Shutdown {
    // Main-Test-Methode
    public static void main(String[] args) {
    }
    
    private boolean isSet = false;
    
    // Konstruktor
    public Shutdown() {
        
    }
    
    // Methoden
    public void setCountDown(int hours, int minutes, int seconds) {
        int gesamt = 0;
        
        ProcessBuilder builder  = new ProcessBuilder("cmd","/c","shutdown -s -t " + gesamt);
        Process process         = null;
        try {
            process = builder.start();
            isSet   = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(process != null) {
                process.destroy();
            }
        }
    }
   
    public boolean isSet() {
        return isSet;
    }
}
```

Vielen Dank auch, dass du mir die ganze Zeit so toll hilfst :toll:


----------



## Tomate_Salat (12. Jan 2010)

hehe

[java=7]
public static void main(String[] args) {
    }
[/code]

willste das er erät, was er tun soll^^ ;-)

MFG

Tomate_Salat



Oscuro hat gesagt.:


> Vielen Dank auch, dass du mir die ganze Zeit so toll hilfst :toll:



danke, mach ich doch gerne ;-)


----------



## Oscuro (12. Jan 2010)

ups 

Hab dort jetzt noch "new Shutdown();" ergänzt, was aber auch nix gebracht hat xD


----------



## Tomate_Salat (12. Jan 2010)

schau dir die klasse an. Die setzt ein setCountDown(int hours, int minutes, int seconds); vorraus. Denn der Konstruktor ist leer ;-) das heist du hast immernoch im Prinzip eine leere Main-Methode^^

MFG

Tomate_Salat


----------



## Oscuro (12. Jan 2010)

Man merkt dass ich noch ein noob bin 

ich hab nun die Sachen wieder ergänzt und "sys.setCountDown(0, 0, 0);" auf 0 gesetzt.
Findeste sonst noch Fehler beim :rtfm: ? 


```
package Shutdown;
 
import java.io.IOException;
 
public class Shutdown {
    // Main-Test-Methode
    public static void main(String[] args) {
    	Shutdown sys    = new Shutdown();
        sys.setCountDown(0, 0, 0);
    }
    
    private boolean isSet = false;
    
    // Konstruktor
    public Shutdown() {
        
    }
    
    // Methoden
    public void setCountDown(int hours, int minutes, int seconds) {
        int gesamt = 0;
        
        ProcessBuilder builder  = new ProcessBuilder("cmd","shutdown -s -t " + gesamt);
        Process process         = null;
        try {
            process = builder.start();
            isSet   = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(process != null) {
                process.destroy();
            }
        }
    }
   
    public boolean isSet() {
        return isSet;
    }
}
```


----------



## Tomate_Salat (12. Jan 2010)

ne, so sollte es gehen. hast du es schonmal getestet?


----------



## Oscuro (12. Jan 2010)

yep, sowohl im Eclipse, als auch in der exportierten .jar
Und es geht nicht :/


----------



## Tomate_Salat (12. Jan 2010)

bringt er eine exception?


----------



## Oscuro (12. Jan 2010)

Es startet einwandfrei und ohne Fehlermeldung.
Nur passieren tut halt nix


----------



## Ein Keks (12. Jan 2010)

versuchs mal so:

```
Runtime.getRuntime().exec("shutdown.bat "+String.valueOf(time));
```
und dann noch folgende bat datei:

```
@echo off
if %1!==! goto ende
shutdown -f -s -t %1
:ende
```
klappt jedenfalls bei mir

edit: 
	
	
	
	





```
Runtime.getRuntime().exec("shutdown -s -t 100");
```
 funzt auch es liegt also scheinbar an dem ProcessBuilder :bahnhof:


----------



## Tomate_Salat (12. Jan 2010)

meine methode muss aber funktionieren, ich hab die ja durchgetestet gehabt, bevor ich sie eingebaut hatte....leider kann ich diese gerade nicht testen weil ich am arbeiten bin und ein neustart viel zeit kosten würde.

€:Mir wurde mal iwo gesagt , dass man den Processbuilder und nicht Runtime.getRuntime() nutzen sollten.


----------



## Oscuro (13. Jan 2010)

Für 
	
	
	
	





```
Runtime.getRuntime().exec("shutdown -s -t 100");
```
 brauche ich die bat Datei dann ja nicht.
Aber welchen Ausdruck soll ich mit dem Befehl ersetzen?

Man muss dann ja praktisch diese Methode komplett umschreiben, oder nicht?

```
public void setCountDown(int hours, int minutes, int seconds) {
        int gesamt = 0;
        
        ProcessBuilder builder  = new ProcessBuilder("cmd","shutdown -s -t " + gesamt);
        Process process         = null;
        
         try {
            process = builder.start();
            isSet   = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(process != null) {
                process.destroy();
            }
        }
    }
```


----------



## Ein Keks (13. Jan 2010)

so müsste es dann aussehen (natürlich jetzt ohne bat)

```
public void setCountDown(int hours, int minutes, int seconds) {
  int gesamt = hours * 3600;
  gesamt += minutes * 60;
  gesamt += seconds;

  try{
    Runtime.getRuntime().exec("shutdown -s -t "+String.valueOf(gesamt));
  catch(IOException e){
    e.printStackTrace();
  }
}
```

die frage bleibt jetzt nur noch was an der methode mit dem processbuilder falsch ist...


----------



## Tomate_Salat (13. Jan 2010)

kann es sein dass folgende Zeile

```
ProcessBuilder builder  = new ProcessBuilder("cmd","shutdown -s -t " + gesamt);
```
eigentl. so sein müsste:

```
ProcessBuilder builder  = new ProcessBuilder("cmd","/c shutdown -s -t " + gesamt);
```

Leider schaue ich in diesen Thread immer erst, wenn ich gerade ein kleine verschnaufpause von meiner aktuellen Arbeit mache und ich hab zuviele Sachen aktiv, als dass ich jetzt einfach mal neustarten kann. Vllt kann das mal einer Testen.

*Edit*
ich hab mal gerade in einer anderen Klasse nachgesehen, von der ich sicher bin dass sie funktioniert und folgenden aufruf gefunden:

```
ProcessBuilder builder  = new ProcessBuilder("cmd","/c","net user \"" + user +  "\" /add");
```

*Edit2*
vllt könnte man auch hier das [c]cmd[/c] (und somit auch das [c]/c[/c] komplett weglassen 

MFG

Tomate_Salat


----------



## Oscuro (14. Jan 2010)

hmm, ich habe nun eure beiden Sachen ausprobiert und es funktioniert leider keine davon :/
(Ich habe bei beiden statische Werte geholt. Für den Test ist das ja egal)


```
package Shutdown;
 
import java.io.IOException;
 
public class Shutdown {
    // Main-Test-Methode
    public static void main(String[] args) {
    	new Shutdown();
    }
    
    private boolean isSet = false;
    
    // Konstruktor
    public Shutdown() {
        
    }
    
    // Methoden
    public void setCountDown(int hours, int minutes, int seconds) {
    	  int gesamt = hours * 3600;
    	  gesamt += minutes * 60;
    	  gesamt += seconds;
    	 
    	  try{
    	    Runtime.getRuntime().exec("shutdown -s -t "+3);
    	    }
    	  catch(IOException e){
    	    e.printStackTrace();
    	  }
    	}
   
    public boolean isSet() {
        return isSet;
    }
}
```

Dein Vorschlag funktioniert auch nicht Tomate.
Ich habe es einmal mit dem zusätzlich /c und dann nochmal ohne cmd und ohne /c probiert.
Beides erfolglos


----------



## Tomate_Salat (14. Jan 2010)

so kann das auch nicht funktionieren:
[java=7]
public static void main(String[] args) {
      new Shutdown();
}
[/code]

wo und wie rufst du hier bit [c]setCountDown(...);[/c] auf? das müsste wenn dann

[java=7]
public static void main(String[] args) {
      Shutdown sd = new Shutdown();
      sd.setCountDown(0,0,0);
}
[/code]

heisen.


----------



## Oscuro (14. Jan 2010)

Sehr sehr nice xD
Vielen Vielen dank
ich habe noch ein "throws IOException" hinzugefügt und dann ging es :applaus:

Hier der gesamte code, falls ihn jemand will 


```
package Shutdown;
 
import java.io.IOException;
 
public class Shutdown {
    // Main-Test-Methode
    public static void main(String[] args) throws IOException {
    	Shutdown sd = new Shutdown();
        sd.setCountDown(0,0,0);
    }
    
    private boolean isSet = false;
    
    // Konstruktor
    public Shutdown() {
        
    }
    
    // Methoden
    public void setCountDown(int hours, int minutes, int seconds) throws IOException {
        int gesamt = 0;
        
        ProcessBuilder builder  = new ProcessBuilder("shutdown -s -t " + 30);
        Runtime.getRuntime().exec("shutdown -s -t 30");
        Process process         = null;
        
         try {
            process = builder.start();
            isSet   = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(process != null) {
                process.destroy();
            }
        }
    }
   
    public boolean isSet() {
        return isSet;
    }
}
```


----------



## Tomate_Salat (14. Jan 2010)

also geht es doch mit meinem ProcessBuilder  muss das iwann mal bei gelegenheit nochmal mit [c]"cmd /c ..."[/c] und [c]"cmd","/c"[/c] ausprobiern.

*Edit* obwohl es nicht sein muss. Wenn du die bereits getestete Runtime() auch für den shutdown einsetzt, dann muss er sich ja herunterfahren.

Mfg

Tomate_Salat


----------



## Benji0815 (14. Jan 2010)

Warum so kompliziert???


Es gibt denn DOS Befehl "at" mit dem man den "shutdown" befehl zu einer bestimmten Zeit ausführen kann. Dann Runtime.getRuntime().exec verwenden.

Ich habe mir dazu mal ein Javaprogramm beschrieben, hab es leider auf meinem alten Pc und jetzt nicht zur Hand.

Mit dem Programm konnte man sofort oder zu einer bestimmten Zeit (z.B. 22:12 Uhr) entweder den Rechner runterfahren, neustarten oder abmelden. Und einen Grund angeben z.B. Feierabend! Und man konnte alle Einträge löschen.

Bsp: (Glaube at funktioniert so)

at 22:00 shutdown -f -s

at (Zeigt in der Console alle Einträge in at an)

at /delete (Console: Löschte Einträge mit at, danach muss man noch mit ja bestättigen, des mit ja bestättigen konnte man auch irgendwie automatisieren)


----------



## Tomate_Salat (14. Jan 2010)

*kopf auf tisch hau* genau nach so einer Möglichkeit hatte ich, als ich die Klasse geschrieben hatte gesucht. 
Jetzt aber mal ernsthaft: Über was sollte man jetzt einen solchen Befehl geben? Runtime oder ProcessBuilder? Weil mir mal gesagt wurde: ProcessBuilder ist hier die bessere Variante, aber ich sehe jetzt schon mehrere Foreneinträge in dem die Runtime genutzt wird....


----------



## Benji0815 (14. Jan 2010)

Ich habe glaube ich die Runtime verwendet!

Wie gesagt ich hab irgendwann mal vor nem Jahr so ein Programm in 15/20 min zusammengetippt ohne das ich mir darüber länger Gedanken gemacht habe und es hat ohne Probleme funktioniert. 

Ich hab mir daraus ne Jar gemacht und es auf meinen Desktop gestellt. 

Jetzt hab ich nen neuen Rechner und der alte liegt bei meinen Eltern in der Wohnung rum. 100 Km entfernt, sonst hätte ich es Dir mal geschickt.

Ich finde den at Befehl ganz praktisch, weil du eben eine genaue Uhrzeit angeben kannst. Der Befehl kann auch noch mehr. Kannst Dir ja mal im Dos anzeigen lassen. 


In Console: at help?


----------



## Tomate_Salat (14. Jan 2010)

ja ne. Mir geht es hier nicht um den Quellcode (aber trotzdem danke ) mir geht es um den Konflikt: Runtime oder ProcessBuilder. Weil ich bin mir zieml. sicher dass mir jmd gesagt hat, ProcessBuilder wäre warum auch immer besser, weil ich auch mit Runtime angefangen hatte....logisch, denn das sind mind. 2 Zeilen weniger als ProcessBuilder 

MFG

Tomate_Salat


----------



## Benji0815 (14. Jan 2010)

Ich denke es kommt darauf an, was du machen willst.


----------



## Ebenius (14. Jan 2010)

Runtime.exec benutzt auch nur einen ProcessBuilder. ProcessBuilder benutzt man dann, wenn man die selbe Umgebung, oder den selben Befehl, oder die selben Argumente oft hintereinander benutzen möchte. Oder wenn man den Error-Strom auf out umlegen möchte. Ansonsten ist Runtime.exec oft besser, weil überschaubarer.

Ebenius


----------



## Tomate_Salat (14. Jan 2010)

sehr gut...danke, damit wäre das Rätsel auch gelöst.

Mfg

Tomate_Salat


----------

