# Batch starten über Java !Fehler!



## theone101 (23. März 2008)

Hallo erst mal,
ich hoffe einer kann mir weiter helfen und zwar:
Ich möchte gerne eine batch ausführen lassen, bis diese beendet wurde. Dann soll mein programm strarten. Dies ist wichtig weil die batch mir ein File erstellt die ich dan später einlesen werde.
Nun mein problem ist das bei mir irgend wie gar nichts get. Er öffnet mir die Batch erstellt mir die File und schreibt aber nix rein.
Hier ein beispiel der Batch:

```
@echo off
dir /b /s *.ts > C:\ZTest.txt
pause
```

Und Hier der Code zum Starten der Batch:

```
Runtime rtm;
		Process proc;
	
try{
		rtm = Runtime.getRuntime();

		proc = rtm.exec("C:\\Test.bat");

		proc.waitFor();

}
catch (Exception e){
	JOptionPane.showMessageDialog(null, "Fehler", "Fehler",0);
}
```
Ich habe es sogar die batch in eine exe konvertiert aber nichts scheint zu funktionieren.
Er startet mir irgend wie die Batch nur ganz kurz den das File ZTest.txt wird zwar generiert 
aber es steht nichts drinnen und mein programm macht einfach weiter.

Ich hoffe jemand kan mir helfen.

Gruß
Thomas


----------



## zeja (23. März 2008)

Hmm warum machst du dir denn ein batch-File um diese Informationen zu bekommen. Das kannst du doch auch direkt mit Java machen.

File.listFiles etc.


----------



## theone101 (23. März 2008)

Oh tut mir leid das habe ich vergessen zu sagen.
Des ist nicht die richtige Batch file ist nur zur Veranschaulichung einfacher.
Bei der richtigen handelt es sich um ein Programmaufruf das leider nur über eine cmd eingegeben werden kann, das habe ich alles schon in einer Batch geschrieben. Das Programm selber gibt mir dann eine Textdatei zurück. Also geht nur über nen Batch aufruf aber ich komme einfach nicht dahinter warum er abbricht und die batch nicht bis zuende ausführt.

Gruß
Thomas


----------



## zeja (23. März 2008)

Welches Java benutzt du denn?

Ab 1.5 gibt es den ProcessBuilder, damit kann man ein paar mehr Sachen einstellen. z.B. RedirectErrorStream um zu schauen ob die Batch-Datei vllt Fehler wirft.

Läuft denn deine Batch-Datei auch im richtigen Ordner?


----------



## theone101 (23. März 2008)

Ich benutze Java 1.6 und die Batch funktioniert einwandfrei wenn ich sie so ausführe, nur über  den aufruf mit java nicht.

Wenn es alternativen dazu gibt währe ich sehr dankbar für anregungen. Da mir nur die exec funktion bekannt ist.

Oder kann ich die komandozeilen in der Batch auch in java so in eine cmd übergeben würde das auch gehen? Wenn ja wie?

Gruß

Thomas


----------



## zeja (23. März 2008)

Deinen letzten Satz habe ich nicht verstanden.

ProcessBuilder: http://www.galileocomputing.de/open...09_005.htm#mjc832440a35cc19d4109b7d937da23679


----------



## Clash (24. März 2008)

theone101 hat gesagt.:


> Oder kann ich die komandozeilen in der Batch auch in java so in eine cmd übergeben würde das auch gehen? Wenn ja wie?



hm eine etwas wirre Ausdrucksweise, aber ich glaube du meinst ob man die kommandos in der batchdatei auch direkt über java ausführen kann. sieht so aus als könnte man das mit dem processbuilder regeln... probiers mal aus


----------



## theone101 (25. März 2008)

Hallo, Danke erstmal an euch alle, habs jetzt soweit hinbekommen, aber in meiner Batch steht:


```
@echo off
dir /b /s *.ts > C:\Test.txt
pause
```

Mein Programm wartet irgend wie net bis die Batch beendet wurde. Es macht einfach weiter hier der code:


```
try{	
		ProcessBuilder processBuilder = new ProcessBuilder("C:/ZTest.bat");
		
		
		Process process = processBuilder.start();
		
		       process.waitFor();
		       
	}catch (Exception e){
		JOptionPane.showMessageDialog(null, "Fehler", "Fehler",0);
	}
```

Hoffe jemand kann mir da noch nen Tipp geben.

Gruß
Thomas


----------



## Clash (25. März 2008)

Hi,
also zunächst mal das "pause" in der batch ist ja nicht nötig, da sie ja aus dem java-programm heraus gestartet wird und das damit verbundene warten ja völlig unnötig ist...
der fehler liegt glaube ich darin, dass er das kommando im aktuellen verzeichnis ausführt und das führt dann zu problemen (warum auch immer )
das problem lässt sich folgendermaßen lösen:
erst die gewünschte festplatte wählen z.B. c
dann noch verzeichnis auf die wurzel setzen (zur sicherheit oder falls man sich schon auf c befindet 

```
c:
cd\

@echo off
dir /b /s *.ts > C:\Test.txt
```

ich hoffe das hilft dir, bei mir hats so auf jeden fall funktioniert .
grüße,
Clash


----------



## zeja (25. März 2008)

Auf jeden Fall solltest du schaun ob irgendwelche Fehler bei der Ausführung auftreten und den Rückgabewert von waitFor verarbeiten:


```
public static void main(String[] args) throws Exception {
	final File f = new File("batch.sh");
	final ProcessBuilder b = new ProcessBuilder(f.getAbsolutePath());
	b.directory(f.getParentFile());// Ausführungsverzeichnis setzen
	b.redirectErrorStream(true);

	final Process process = b.start();

	// Ausgabe des Prozesses lesen
	final BufferedReader r = new BufferedReader(new InputStreamReader(
			process.getInputStream()));
	String line = null;
	while ((line = r.readLine()) != null) {
		System.out.println(line);
	}
	
	int term = process.waitFor();
	System.out.println("Process terminated successfully: " + (term==0));
}
```


----------



## theone101 (25. März 2008)

Hm Funktioniert immer noch nicht richtig er macht zwar jetzt den befehl den er soll auch alles hintereinander, aber alles im hintergrund. Ich sehe also das cmd Fenster nicht.

Kann man des irgend wie einbelnden oder anstatt das cmd Fenster irgend eine MsgBox aufrufen das ich weis das da gerade was läuft.

Das ist Wichtig im nachhinein möchte ich alles über eine .jar aufrufen und da möchte ich sehen was gerade passiert.

Gruß Thomas


----------



## zeja (25. März 2008)

Also ich fände es unschön wenn du nen Command-Fenster mit aufmachen würdest.

Aber du kannst ja das was ich dir in meinem Beispiel gezeigt habe, statt auf die Konsole in nen eigenes Fenster ausgeben.


----------



## zeja (25. März 2008)

Ich finde das so ganz schick eigentlich:

```
package de.tutorials;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class LogProcessBuilder {

	public static class LogFrame extends JFrame {

		private static final String LINE_SEP = System
				.getProperty("line.separator");

		private JTextArea log;

		public LogFrame(InputStream stream) {
			super("log");
			init();
			readFromStream(stream);
		}

		private void init() {
			setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			log = new JTextArea();

			JScrollPane scroll = new JScrollPane(log);
			add(scroll);

			setSize(400, 400);
		}

		private void readFromStream(InputStream stream) {
			final BufferedReader r = new BufferedReader(new InputStreamReader(
					stream));
			try {
				String line = null;
				while ((line = r.readLine()) != null) {
					log.append(line);
					log.append(LINE_SEP);
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		final File f = new File("batch.sh");
		final ProcessBuilder b = new ProcessBuilder(f.getAbsolutePath());
		b.directory(f.getParentFile());// Ausführungsverzeichnis setzen
		b.redirectErrorStream(true);

		final Process process = b.start();
		JFrame logFrame = new LogFrame(process.getInputStream());
		logFrame.setVisible(true);

		int term = process.waitFor();
		System.out.println("Process terminated successfully: " + (term == 0));
	}

}
```


----------

