# Problem beim ausführen von Batchdateien



## manuche (30. Mai 2008)

Hallo,
ich schreibe mir grad ein Programm mit dem man andere Programme ausführen kann... Für dieses Programm sollen dann Callbacks (Batch-Dateien) ausgeführt werden... Jeweils vor und nach dem eigentlichen Programm!
Dazu erzeuge ich mir einen Thread indem nacheinader die Callbacks bzw das Programm ausgeführt wird.
Da die Prozesse in Abhängigkeit von einander sind, warte ich mit prozess.waitFor() darauf, dass ein Prozess beendet wird, sodass der nächste gestartet werden kann! 
Dabei taucht folgendes Problem auf: Direkt nach dem Start-Callback bleibt das Programm hängen, auch die Batch-Datei scheint nicht ordnungsgemäß ausgeführt worden zu sein, da einige Dienste unter WindowsXP nicht gestartet wurden...
Wenn ich die Batchdatei normal ausführe funktioniert dies aber...

Hier mal die Threadklasse:

```
public class Exec extends Thread implements Runnable{
	private Thread	controller;
	private String	start;  //Pfade auszuführenden Batch-Dateien bzw zur exe
	private String	prog;
	private String	end;

	public Exec(String start, String prog, String end) {
		this.start = start;
		this.prog = prog;
		this.end = end;
		this.controller = new Thread (this);
		this.controller.setPriority (Thread.MIN_PRIORITY);
		this.start ();
	}

	@SuppressWarnings ("static-access")
	@Override
	public void run (){
		try{
			if (start != null){
				Process p = Runtime.getRuntime ().exec (start);
				p.waitFor ();
				this.handle (p.getInputStream ());
			}
			if (prog != null){
				Process p = Runtime.getRuntime ().exec (prog);
				p.waitFor ();
			}
			if (end != null){
				Process p = Runtime.getRuntime ().exec (end);
				p.waitFor ();
				this.handle (p.getInputStream ());
			}
		}catch (IOException ioe){
			ioe.printStackTrace ();
		}catch (InterruptedException ie){
			ie.printStackTrace ();
		}
		try{
			this.finalize ();
		}catch (Throwable t){
			t.printStackTrace ();
		}
	}

	private void handle (InputStream is) throws IOException{
		InputStreamReader isr = new InputStreamReader (is);
		BufferedReader br = new BufferedReader (isr);
		System.out.println (br.readLine ());
	}
}
```

und ein Beispiel Bath-File:


```
net start DienstA
net start DienstB
net start DienstC
net start DienstD
```

Weiss jemand woran es liegen könnte?[/code]


----------



## The_S (30. Mai 2008)

was für Parameter übergibst du denn?


----------



## manuche (30. Mai 2008)

An die Exec-Mehtode? Wenn ja dann den Pfad zu der Batch-Datei!

Hab so auch schon Batch-Dateien mit einer Zeile ausgeführt, was auch schonmal funktioniert hat...


----------



## The_S (30. Mai 2008)

ja und sonst nichts? Kein vorangestelltes "cmd /c" bzw. "cmd /c start"?

Exec ist übrigens keine Methode sondern ein Konstruktor  .


----------



## manuche (30. Mai 2008)

Nein... nur den Pfad zu der Datei die ausgeführt werden soll...
Hat auch so in den ersten Testphasen funktionert und die exe lässt sich so auch ohne weiters ausführen!
Belehrt mich eines besseren aber eine Batch-Datei startet ja normalerweise eh die Konsole...

meinte auch die exec-Methode von der Runtime-Klasse und nicht meinen Konstruktor! ^^


----------



## The_S (30. Mai 2008)

Versuchs trotzdem mal mit einem cmd /c (start) vorneweg ...


----------



## manuche (30. Mai 2008)

wofür genau steht das " /c"? cmd ist klar und start ist ja der komplette Pfad zu der Datei mit allem drum und dran...  xD


----------



## The_S (30. Mai 2008)

hä? start ist der Pfad ???:L ? start ist ein Schlüsselwort zum Öffnen einer neuen Konsole (zumindest unter win). Das "/c" musst du schreiben, wenn du nach dem cmd noch was in der cmd ausführen willst. Nimms einfach als gegeben, dass du es brauchst (und NEIN, es hat nichts mit Laufwerksbuchstaben zu tun  ).


----------



## manuche (30. Mai 2008)

haha geil... start heisst in meinem programm der string indem der pfad zu der Batch-Datei steht, die vor dem eigentlich Programm ausgeführt werden soll... 

Hab das ganze mal getestet! Ergebnis ist, dass die Batch-Datei zwar anscheinen nicht vernünftig ausgeührt wird, da bei dem eigentlichen programmstart die dienste nicht gestartet sind!


----------



## The_S (30. Mai 2008)

Dann arbeite dich mal stück für stück vor ...

Mach mal den einfachen Aufruf 

```
Runtime.getRuntime().exec("lw:/pfad/zur/batch/datei.bat");
```

Wenn das nicht geht, versuchst du das hier


```
Runtime.getRuntime().exec("cmd /c lw:/pfad/zur/batch/datei.bat");
```

und wenn das auch nicht geht das hier


```
Runtime.getRuntime().exec("cmd /c start lw:/pfad/zur/batch/datei.bat");
```

und wenn auch das nicht geht, dann überprüf mal ob der Pfad/die Datei leerzeichen enthält und deshalb etwas schief läuft.

Ansonsten machste nix. Einfach nur ne einfache Klasse mit main-Methode die außer diesen aufruf nix macht. Und wenn de alle 3 Methoden versucht hast, dann meldeste dich nochmal  .


----------



## manuche (30. Mai 2008)

Vorschlag 1 war mein Standard bis jetzt und hat aus den oben genannten Gründen nicht funktionert.

Vorschlag 2 genießt den gleichen Erfolg...

Vorschlag 3 führt dazu, dass alles Dienste gestartet werden, allerdings das eingentliche Programm schon gestartet wird, bevor die Batch-Datei terminiert ist. Und die Konsole bleibt offen


----------



## The_S (30. Mai 2008)

Dann nimm den Vorschlag 3, vergiss "p.waitFor()" und lass stattdessen am Ende von deiner Batch-Datei z. B. eine kleine Datei erstellen. Mit deinem Java-Programm überprüfst du dann, ob die Datei schon existiert, falls ja => weiter im takt.

Ganz andere Idee: Warum nicht eine große Batch-Datei? Die startet zuerst die Dienste, anschließend das Programm und am Ende macht sie das, was dein letzter Aufruf machen soll (Dienste wieder beenden!?).


----------



## manuche (30. Mai 2008)

Ich möchte eigentlich nur die eigentlich Funktinalität beibehalten... Es soll ja nicht jedes Programm ein Callback besitzen! Das ganze soll halt optional sein!


----------



## The_S (30. Mai 2008)

ja und? Was willst du mir damit sagen?


----------



## manuche (30. Mai 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Ganz andere Idee: Warum nicht eine große Batch-Datei? Die startet zuerst die Dienste, anschließend das Programm und am Ende macht sie das, was dein letzter Aufruf machen soll (Dienste wieder beenden!?).



...den Grund warum ich nicht eine große Batchdatei erstelle die alles ausführt...


----------



## The_S (30. Mai 2008)

Hab ja auch noch eine Zweite Idee. Und du kannst ja je nach Übergabeparameter die Große ansprechen, oder eben nicht (genau genommen kannst du dir die batch-dateien ja auch selbst basteln und aus deinem Programm heraus speichern).

Versteh das Problem nicht so ganz ???:L


----------



## manuche (30. Mai 2008)

Soll ja jetzt auch nicht Problem des ganzen sein 
Ich würde dann wohl die Variante mit der Datei bevorzugen...
Nur mal blöd gefragt: Wie erstelle ich aus einer Batchdatei eine andere Datei? Den Befehl umzu löschen hab ich gefunden aber nicht den zum Datei erstellen!?


----------



## The_S (30. Mai 2008)

```
echo in eine Datei mit dir >> ausgabe.txt
```

Erstellt die Datei "ausgabe.txt" im selben Ordner wie deine bat-Datei liegt und schreib "in eine Datei mit dir" in diese txt.


----------



## manuche (30. Mai 2008)

Also es steht zwar in der Konsole drin aber die Datei ist nirgens zu finden!


----------



## Soi (30. Mai 2008)

Du musst in deiner Klasse auch nicht Runnable implementieren, da Thread das bereits tut.


----------



## manuche (1. Jun 2008)

Alles klar... Es muss 

```
echo in eine Datei mit dir > ausgabe.txt
```
heissen!
eine spitze Klammer zu erstellt eine Datei und zwei spitze Klammern zu schreiben in eine vorhanden Datei!


----------



## The_S (2. Jun 2008)

sorry, mein Fehler  . Habs nicht wirklich ausprobiert sondern aus meinem Gedächtnis geschrieben - und das ist wohl lückenhaft  .


----------

