# .bat Dateien starten, Ausgabe einlesen und Befehle übergeben



## KlemensyXYZ (20. Sep 2011)

Moin,

ich möchte mit meinem Programm eine .bat Datei starten.

Das mache ich so:

```
package starten;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Starten
{
	public static void main (String args[]) throws IOException, InterruptedException
	{
		ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "start.bat");
	    processBuilder.directory(new File("D:/Bukkit/"));
	 
	    final Process process = processBuilder.start();
	    ExecutorService executorService = Executors.newSingleThreadExecutor();
	    executorService.execute(new Runnable() {
	      public void run() {
	        Scanner scanner = new Scanner(process.getInputStream());
	        while (scanner.hasNextLine()) {
	          System.out.println(scanner.nextLine());
	        }
	        scanner.close();
	      }
	    });
	 
	    System.out.println(process.waitFor());
	    executorService.shutdown();
	}
}
```

um das zu testen habe ich die Start.bat von meinem Bukkit Minecraftserver genommen.
Dabei gibt es folgendes Problem, d.h. die ausgabe müsste so aussehen:

```
146 recipes
[Lnet.minecraft.server.Statistic;@2e7820
16 achievements
[Lnet.minecraft.server.Statistic;@2e7820
16:05:09 [INFO] Starting minecraft server version Beta 1.5_02
16:05:09 [INFO] Loading properties
16:05:09 [INFO] Starting Minecraft server on *:25565
```
un noch einiges mehr an Text.
Die Ausgabe sieht aber so aus:

```
146 recipes
[Lnet.minecraft.server.Statistic;@2e7820
16 achievements
>
>
>
>
```

warum können die restlichen Zeilen nicht angezeigt werden?
Mache ich irgendetwas falsch?

Nun zu meiner 2. Frage:
wenn ich es denn irgendwann einmal geschafft habe möchte ich der .bat Datei, bzw. der cmd ausführung einer bestimmeten Datei Befehle übergeben.
Dies könnte man auch anhand des Minecraft Servers testen.
Hier könnte ein Befehl z.B. so aussehen 
	
	
	
	





```
/day
```
.
Wie kann ich das tun?

Danke


----------



## Andi_CH (20. Sep 2011)

Nimm ein "hello world" bat - das hilft dir viel weiter!


----------



## U2nt (20. Sep 2011)

Wieso den Umweg beim Minecraft-Server? Minecraft is doch in Java programmiert, die main Aufrufen könnte auch eine Alternative sein.


----------



## Network (20. Sep 2011)

Nur mal so... nenne die .bat lieber nicht start... sondern nimm einen ausgefalleneren Namen.
Ich habe batch-Dateien schon lange nicht mehr verwendet aber ich glaube du darfst die Datei nicht so nennen wie ein Befehl der (so genau weiss ich es nicht mehr) batch ausführen kann oder in der batch-Datei drin steht =)


----------



## Andi_CH (20. Sep 2011)

Funktioniert wunderbar!

Deine Probleme liegen beim Minecraft-Geschwür und nicht im Javaprogramm


Edit - kann keine Attachments anhängen - das bat halt als code am Ende ...

```
import java.io.File;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class StarteBat {

	public static void main (String args[]) {
		ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "hello.bat klemensyXYZ");
		processBuilder.directory(new File("C:/temp/"));
		try {
			final Process process = processBuilder.start();
			ExecutorService executorService = Executors.newSingleThreadExecutor();
			executorService.execute(new Runnable() {
				public void run() {
					Scanner scanner = new Scanner(process.getInputStream());
					while (scanner.hasNextLine()) {
						System.out.println(scanner.nextLine());
					}
					scanner.close();
				}
			});

			System.out.println(process.waitFor());
			executorService.shutdown();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
```

hello.bat

```
@echo off
echo hallo %1
return 1
```


----------



## Spacerat (20. Sep 2011)

In welchen Abständen schreibt denn der MC-Server seine Log-Daten in die Console? Kann es sein, dass des Runnable nach der besagten Zeile keinen Input mehr bekommt (in diesem Fall hätte Scanner keine nextLine mehr) und sich dadurch vorzeitig beendet?
@Andy_CH: Ich denke mal, so ein "hello world" hilft hier nicht wirklich.


----------



## Andi_CH (20. Sep 2011)

Wenn das nicht hilft ist keinem mehr zu helfen -

Die Frage war, wie ein bat zu starten ist und wie man Parameter übergibt.

Da steckt alles drin.

Mit welchen Parametern man ein Minraftgeschwür starten muss dass es keine Fehlermeldungen gibt, ist ja wohl nicht Thema eines  Javaforums.


----------



## KlemensyXYZ (20. Sep 2011)

Spacerat hat gesagt.:


> In welchen Abständen schreibt denn der MC-Server seine Log-Daten in die Console? Kann es sein, dass des Runnable nach der besagten Zeile keinen Input mehr bekommt (in diesem Fall hätte Scanner keine nextLine mehr) und sich dadurch vorzeitig beendet?
> @Andy_CH: Ich denke mal, so ein "hello world" hilft hier nicht wirklich.



tja ich denke mal daran kanns nicht liegen.
Mincraft schreibt solange was in die Console, wie der Server läuft.

Theoretisch könnte ich ja auch die log.txt zum auffangen der Ausgabe mit nem anderen Scanner auslesen, oder?

Ich habe da aber auch mal eine andere Vermutung.
Auf meinem Server befinden sich auch verschiedene Plugins, die auch .jar's sind. 
Vielleicht gibts da bei der Übergabe an mein Programm ein paar Probleme.
Wie man das löst weis ich aber trotzdem nicht. :autsch:



U2nt hat gesagt.:


> Wieso den Umweg beim Minecraft-Server? Minecraft is doch in Java programmiert, die main Aufrufen könnte auch eine Alternative sein.



Ja, auch bukkit is ne .jar Datei.
Könnte man auch hier die "Ausgabe" in einem anderen Programm abfangen?
Ich glaube nicht.
Außerdem:
Ich starte den Server und auch Minecraft mit einer .bat um ihnen mehr RAM zu geben, den sie aufgrund der hohen Spielerzahl und einem x512 texture pack auch brauchen.



Network hat gesagt.:


> Nur mal so... nenne die .bat lieber nicht start... sondern nimm einen ausgefalleneren Namen.
> Ich habe batch-Dateien schon lange nicht mehr verwendet aber ich glaube du darfst die Datei nicht so nennen wie ein Befehl der (so genau weiss ich es nicht mehr) batch ausführen kann oder in der batch-Datei drin steht =)



Das hat keinen Erfolg gebracht.
Gleicher Fehler wie oben!



Andi_CH hat gesagt.:


> Mit welchen Parametern man ein Minraftgeschwür starten muss dass es keine Fehlermeldungen gibt, ist ja wohl nicht Thema eines  Javaforums.



Wenn ich denn ne Fehlermeldung hätte könnte die mir vielleicht sogar weiterhelfen.
Und:
Das mit der Hello.bat hab ich vorher probiert bevor ich mich an andere Dinge gewagt habe.ueh:


----------



## Spacerat (20. Sep 2011)

KlemensyXYZ hat gesagt.:


> tja ich denke mal daran kanns nicht liegen.
> Mincraft schreibt solange was in die Console, wie der Server läuft.


Fataler Irrtum!
Klar schreibt Minecraft immer mal was in die Konsole solange es läuft. Nur leider kann es vorkommen, dass es dieses gerade nicht getan hat, während deine Anwendung die augenblicklich letzte Zeile gelesen hat. Dadurch wird
	
	
	
	





```
while(scanner.hasNextLine()) {
  ...
}
```
vorzeitig beendet. Selbst wenn Minecraft noch läuft, wird es deine Anwendung dann nicht mehr mitbekommen. Kurzgesagt: Diese Abbruchbedingung muß eine andere werden.


----------



## KlemensyXYZ (20. Sep 2011)

ahhh

äh

und wo kommen dann die 

```
>
>
>
>
```
in der exakten anzahl der noch fehlenden Zeilen her?

edit: hab das mal überprüft:
mein Java Code:

```
package starten;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class Starten 
{
	static String str;
	static int x = 1;
//	public Starten() throws IOException, InterruptedException
	public static void main (String args[]) throws Exception
	{
		{
			ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "Start.bat");
		    processBuilder.directory(new File("./Bukkit/"));
//		    processBuilder.start();
		    final Process process = processBuilder.start();
		    ExecutorService executorService = Executors.newSingleThreadExecutor();
		    executorService.execute(new Runnable() {
		      public void run() {
		        Scanner scanner = new Scanner(process.getInputStream());
		        while (x == 1) {
		          System.out.println(scanner.nextLine());
		        }
		        scanner.close();
		      }
		    });
		 
		    System.out.println(process.waitFor());
		    executorService.shutdown();
		}   
	
}
```

die Ausgabe:

```
[Lnet.minecraft.server.Statistic;@d08633
146 recipes
[Lnet.minecraft.server.Statistic;@d08633
16 achievements
>
>
>
>
```

also hat sich da leider nichts getan


----------



## Spacerat (20. Sep 2011)

Ok... jetzt wird's allerdings problematisch... werden die Zeilen vllt. von einem MC-Unterprozess - evtl. ein Java Thread oder gar ein von dort aus neu gestartetem - geschrieben und der Scanner bekommt deswegen nichts davon mit? Mal experimentieren...


----------



## Kevin94 (20. Sep 2011)

Nur mal so: ein Prozess hat doch auch einen ErrorStream...
Das wäre zwar alles andere als Standartkonform, aber trotzdem vorstellbar.

Außerdem nutzt mincraft auch eigen Native Bibliotheken, wer sagt den, dass das Logging nicht nativ geschieht.
Aber dass würde ja dann trotzdem in einem der Streams landen, wenn es auch auf der Konsole erscheint, oder?


----------



## Spacerat (20. Sep 2011)

@Kevin94: Bingo... das dachte ich mir nämlich auch... aber irgendwie ???:L


----------



## KlemensyXYZ (20. Sep 2011)

ähm muss ich was und was muss ich im Quelltext ändern?
oder hab ich da jetzt was falsch verstanden? ???:L


----------



## Kevin94 (20. Sep 2011)

Du kannst es mit einen zweiten Scanner der 
	
	
	
	





```
process.getErrorStream();
```
 abfragt versuchen.


----------



## KlemensyXYZ (20. Sep 2011)

WUNDERBAR 
ES GEHT (fast) 

die Ausgabe:

```
[Lnet.minecraft.server.Statistic;@d08633
21:28:47 [INFO] Starting minecraft server version Beta 1.5_02
146 recipes
21:28:47 [INFO] Loading properties
[Lnet.minecraft.server.Statistic;@d08633
21:28:47 [INFO] Starting Minecraft server on *:25565
16 achievements
21:28:47 [INFO] This server is running Craftbukkit version git-Bukkit-0.0.0-700-gf3ae4c3-b733jnks (MC: 1.5_02)
>
21:28:47 [INFO] Preparing level "world"
>
21:28:47 [INFO] Preparing start region
>
21:28:48 [INFO] [AuthMe] Using flatfile as datasource!
>
21:28:48 [INFO] [AuthMe] Cache for registrations is enabled!
>
21:28:48 [INFO] [AuthMe] 16 registered players loaded in 0.0090 seconds!
>
21:28:48 [INFO] [AuthMe] Version 0.72 was successfully loaded!
>
21:28:48 [INFO] CraftBookCommon 3.0-alpha2 enabled.
>
21:28:48 [INFO] CraftBookCommon: Permissions plugin detected! Using Permissions plugin for permissions.
>
21:28:48 [INFO] CraftBookCircuits 3.0-alpha2 enabled.
>
21:28:48 [INFO] CraftBookCircuits: Permissions plugin detected! Using Permissions plugin for permissions.
>
21:28:48 [INFO] CraftBookCircuits: Permissions plugin detected! Using Permissions plugin for permissions.
>
21:28:48 [INFO] CraftBookMechanisms 3.0-alpha2 enabled.
>
21:28:48 [INFO] CraftBookMechanisms: Permissions plugin detected! Using Permissions plugin for permissions.
>
21:28:48 [INFO] 1 cauldron recipe(s) loaded
>
21:28:48 [INFO] CraftBookVehicles 3.0-alpha2 enabled.
>
21:28:48 [INFO] CraftBookVehicles: Permissions plugin detected! Using Permissions plugin for permissions.
>
21:28:48 [INFO] [CreatureSpawner] version 1.1 by [Xstasy] enabled.
>
21:28:48 [INFO] GroupManager - INFO - Scheduled Data Saving is set for every 10 minutes!
>
21:28:48 [INFO] GroupManager version 1.0(alpha-5) is enabled!
>
21:28:48 [INFO] Fake Permissions version 2.5.2 is enabled!
>
21:28:48 [INFO] CraftBookCircuits: Permissions plugin detected! Using Permissions plugin for permissions.
>
21:28:49 [INFO] Loaded Essentials build 2.1.25 maintained by Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo and ceulemans.
>
21:28:49 [INFO] Loaded EssentialsChat build 2.1.25 by Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo and ceulemans.
>
21:28:49 [INFO] Fake Permissions version 2.5.1 is enabled!
>
21:28:49 [INFO] CraftBookCircuits: Permissions plugin detected! Using Permissions plugin for permissions.
>
21:28:49 [INFO] Loaded EssentialsProtect build 2.1.25 maintained by Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo and ceulemans.
>
21:28:49 [INFO] Loaded EssentialsSpawn build 2.1.25 maintained by Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo and ceulemans.
>
21:28:49 [INFO] Lockette version 1.3.4 is being enabled!  Yay!
>
21:28:49 [INFO] Lockette: Detected craftbukkit build [733] ok.
>
21:28:49 [INFO] Lockette: Linked to GroupManager plugin version 1.0(alpha-5)
>
21:28:49 [INFO] Lockette: Ready to protect your containers.
>
21:28:49 [INFO] [mcMMO] Permissions enabled.
>
21:28:49 [INFO] mcMMO version 0.9.23 is enabled!
>
21:28:49 [INFO] [MotherNature] Using GroupManager version 1.0(alpha-5) for permission handling
>
21:28:49 [INFO] [MotherNature] Plugin enabled! (version 1.2)
>
21:28:49 [INFO] [OpenInv] version 1.1.1 is enabled!
>
21:28:49 [INFO] PlgEssentials version 4.2 is enabled!
>
21:28:49 [INFO] War> War v1.5.1 (MacArthur) is on.
>
21:28:49 [INFO] WorldEdit 4.4 enabled.
>
21:28:49 [INFO] WorldEdit: Permissions plugin detected! Using Permissions plugin for permissions.
>
21:28:49 [INFO] Done (0,164s)! For help, type "help" or "?"
>
```

Hat jetzt noch wer eine Idee wie man da die ganzen 
	
	
	
	





```
>
```
 rausbekommt?

Und dann noch das:


KlemensyXYZ hat gesagt.:


> Nun zu meiner 2. Frage:
> wenn ich es denn irgendwann einmal geschafft habe möchte ich der .bat Datei, bzw. der cmd ausführung einer bestimmeten Datei Befehle übergeben.
> Dies könnte man auch anhand des Minecraft Servers testen.
> Hier könnte ein Befehl z.B. so aussehen
> ...


----------



## Kevin94 (20. Sep 2011)

```
String tmp=inputScanner.nextLine();
if(!tmp.equals(">"))
System.out.println(tmp);
```

Den genauen String auf den geprüft wird ggf variieren (Leerzeichen,Zeilenendezeichen )

EDIT: 2.Frage:

Schreib deinen befehl einfach in 
	
	
	
	





```
process.getInputStream();
```
 und Enter(\r\n) nicht vergessen


----------



## KlemensyXYZ (20. Sep 2011)

Kevin94 hat gesagt.:


> ```
> String tmp=inputScanner.nextLine();
> if(!tmp.equals(">"))
> System.out.println(tmp);
> ...



Danke, geht:applaus: 



Kevin94 hat gesagt.:


> EDIT: 2.Frage:
> 
> Schreib deinen befehl einfach in
> 
> ...



ähm hättest du nen Quelltext?
Ich kann mir das grade nicht vorstellen


----------



## Kevin94 (20. Sep 2011)

```
public void writeCommand(Process p,String command)
{
    String tmp=command+"\r\n";
    p.getOutputStream().write(tmp.getBytes());
}
```


----------



## KlemensyXYZ (21. Sep 2011)

ok.
Ich habe mir nun mit Netbeans schnell ne GUI zusammengeklickt.
ich habe vor die ausgabe nutzergerecht in einem Textfeld auszugeben.
Der Quelltetxt sieht jetzt so aus:

```
package gui;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class Starten
{
	static String str;
	static int x = 1;
	public static boolean starten = false;
	static String tmp2;
	public static String tmp;
	static String text;
	
	public static void main (String args[]) throws Exception
	{
		if (starten == true)
		{
			try
			{
				BufferedReader in = new BufferedReader (new FileReader("./Optionen/optionen.txt"));
				str = in.readLine();
				in.close();	
			}		
			catch (Exception e)
			{		
				System.out.println("hier " + e);
			}	
			
			if (str.equals("1024"))
			{
				ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "Start.bat");
			    processBuilder.directory(new File("./Bukkit/"));
			    final Process process = processBuilder.start();
			    ExecutorService executorService = Executors.newSingleThreadExecutor();
			    executorService.execute(new Runnable() {
			    	public void run() 
			    	{
			    		Scanner scanner = new Scanner(process.getInputStream());
			        	Scanner scanner2 = new Scanner(process.getErrorStream());
			        	while (x == 1) 
			        	{
			        		try
			        		{
			        			tmp1 = scanner.nextLine();
			        		}
			        		catch (Exception e)
			        		{
			        			System.out.println(e);
			        		}
			        		
			        		if(!tmp1.equals(">"))
			        		{
			        			tmp2 = tmp1;
			          		}
			        		
			        		try
			        		{
			        			tmp3 = scanner2.nextLine();
			        		}
			        		catch (Exception e)
			        		{
			        			System.out.println(e);
			        		}
			        		
			        		if (tmp3 == null)
			        		{
			        			tmp = tmp2;
			        		}
			        		if (tmp3 != null)
			        		{
			        			tmp = tmp2 + '\n' + tmp3;
			        		}
			        		GUI_Haupt guihaupt = new GUI_Haupt();
			        		text = "Start" + '\n';
			            	text = text.concat(tmp) + '\n';
			            	System.out.println(text);
			            	guihaupt.TextAusgabefeldLog.setText(text);			        		
			        	}
			        	scanner.close();
			    	}
			    });
			 
			    System.out.println(process.waitFor());
			    executorService.shutdown();
			}   
		}
		
	}
}
```

wenn ich jetzt aber auf den Button zum Starten klicke Friert das Programm ein und es passiert gar nichts mehr.

edit: Ich hab da son ne Idee. Müsste ich die Klasse mit dem auslesen der .bat in nem neuen Thread starten? Oder geht das auch anders und einfacher? Mit den Threads hab ich noch nichts gemacht

Oder habe ich einfach schon wieder was falsch gemacht?


----------



## Kevin94 (21. Sep 2011)

Mit dem Code allein kann man das Problem nicht bestimmen. Wichtig ist in diesem Fall die ActionListener Methode. Solange die nicht beendet wurde, wird das GUI auch nicht neu gezeichnet, d.h. wenn in dieser Methode viel zeitintensives drin steht, musst du einen neuen Thread starten.

PS: das von gestern Abend war quatsch, es muss 
	
	
	
	





```
p.getOutputStream().write()
```
 heißen und nicht 
	
	
	
	





```
p.getInputStream().write()
```


----------



## KlemensyXYZ (21. Sep 2011)

Kevin94 hat gesagt.:


> ... wenn in dieser Methode viel zeitintensives drin steht, musst du einen neuen Thread starten.



ich würde nicht sagen das dass Zeitintensiv ist sondern dauerhaft 
Ich befrag mal mein "Java ist auch eine Insel" nach den Threads.
Wenns nix wird melde ich mich wieder.



Kevin94 hat gesagt.:


> PS: das von gestern Abend war quatsch, es muss
> 
> 
> 
> ...



hatte ich auch noch nicht getestet 

edit1:
Ich glaube da könnts ein Problem geben.
Hier steht das ein Thread ne run() Methode braucht.
In meiner Klasse ist aber schon eine drin.
Wie mache ich das denn jetzt?

edit2:
Problem aus edit1 gelöst.
Trtotzdem kommt das ganze immer noch nicht in der TextArea an.


----------



## KlemensyXYZ (25. Sep 2011)

Moin
ähm ja habe da schon wieder ein Problem.
und zwar werden meine Befehle nicht ausgeführt.

Ich habe das so versucht:

```
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "Start.bat");
processBuilder.directory(new File("./Bukkit/"));
final Process process = processBuilder.start();
new ProzessUebergeben(process);
```

die Klasse ProzessUebergeben sieht so aus:

```
public class ProzessUebergeben 
{
	public static Process process2;	
	public ProzessUebergeben(Process process)
	{
		process2 = process;
	}
	
	public static Process getProcess()
	{
		return process2;
	}
}
```

und soll des Prozess an die Klasse weitergeben die den Prozess ausführt.
Diese sieht so aus:


```
public class BefehlAusführen 
{
	Process process;
	static String command;
	
	public BefehlAusführen()
	{
		process = ProzessUebergeben.getProcess();
		System.out.println(command);
		System.out.println(process);
		String tmp = command + "\r\n";
	    try 
	    {
			process.getOutputStream().write(tmp.getBytes());
		} 
	    catch (Exception e) 
	    {
			e.printStackTrace();
		}
	}
}
```

Die Ausgabe dieser Klasse sieht so aus:

```
/stop
java.lang.ProcessImpl@18ee9d6
```

Ich denke mal das bis hierhin alles stimmt.
Trotzdem wird der Befehl nicht ausgeführt.

Wo ist denn mein Fehler?


----------



## Kevin94 (26. Sep 2011)

Es liegt daran wie du das Programm startest:
Du startest eine neue cmd und in dieser eine bat in der du dann minecraft startest.

Ums kurz zu machen du schreibst den befehl in die cmd und nicht in minecraft. Also versuch erstmal, die bat ohne die cmd zu starten, oder minecraft direkt aus java zu starten.

btw: hast du schon mal was von statischen Methoden gehört, z.B. wie in Maths.
Die hauptarbeit in Konstruktoren zu erledigen ist schlechtes Design


----------



## KlemensyXYZ (27. Sep 2011)

Kevin94 hat gesagt.:


> Es liegt daran wie du das Programm startest:
> Du startest eine neue cmd und in dieser eine bat in der du dann minecraft startest.
> 
> Ums kurz zu machen du schreibst den befehl in die cmd und nicht in minecraft. Also versuch erstmal, die bat ohne die cmd zu starten, oder minecraft direkt aus java zu starten.



wenn ich das 
	
	
	
	





```
"cmd",
```
 in

```
ProcessBuilder processBuilder = new ProcessBuilder("cmd", "/c", "Start.bat");
			    processBuilder.directory(new File("./Bukkit/"));
			    final Process process = processBuilder.start();
```

also so

```
ProcessBuilder processBuilder = new ProcessBuilder("/c", "Start.bat");
			    processBuilder.directory(new File("./Bukkit/"));
			    final Process process = processBuilder.start();
```
bekomme ich diese Fehlermeldung:

```
java.io.IOException: Cannot run program "/c" (in directory ".\Bukkit"): CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessBuilder.start(Unknown Source)
	at bukkit_gui.ServerStarten.<init>(ServerStarten.java:28)
	at bukkit_gui.NeuerThread.run(NeuerThread.java:10)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: CreateProcess error=2, Das System kann die angegebene Datei nicht finden
	at java.lang.ProcessImpl.create(Native Method)
	at java.lang.ProcessImpl.<init>(Unknown Source)
	at java.lang.ProcessImpl.start(Unknown Source)
	... 4 more
```

hast du das vielleicht anders gemeint?


----------



## Kevin94 (27. Sep 2011)

das "\c" ist eine Aufrufoption von cmd.exe -> musst du auch weglassen

Schreib einfach:

```
ProcessBuilder processBuilder = new ProcessBuilder("Start.bat");
processBuilder.directory(new File("./Bukkit/"));
final Process process = processBuilder.start();
```


----------



## KlemensyXYZ (27. Sep 2011)

das hat nichts gebracht.
Der Befehl wird immer noch nicht ausgeführt.

Der Server läuft immer noch obwohl das Programm beendet wurde.


----------



## Kevin94 (27. Sep 2011)

was steht in Start.bat?


----------



## KlemensyXYZ (27. Sep 2011)

das hier:

```
@ECHO OFF
IF /I "%PROCESSOR_ARCHITECTURE:~-2%"=="64" "%ProgramFiles(x86)%\Java\jre6\bin\java.exe" -Xms1024M -Xmx1024M -jar "%~dp0craftbukkit-0.0.1-snapshot.jar"
IF /I "%PROCESSOR_ARCHITECTURE:~-2%"=="86"  java -Xms1024M -Xmx1024M -jar "%~dp0craftbukkit-0.0.1-snapshot.jar"

PAUSE
```

ist die Original .bat; habe daran nichts geändert


----------



## Kevin94 (27. Sep 2011)

dann würde ich vorschlagen folgendes auszuprobieren:


```
ProcessBuilder processBuilder;
if(System.getProperty("os.arch")=="x64") 
    processBuilder=new ProcessBuilder("%ProgramFiles(x86)%\Java\jre6\bin\java.exe", "-Xms1024M", "-Xmx1024M", "-jar","%~dp0craftbukkit-0.0.1-snapshot.jar");
else
    processBuilder=new ProcessBuilder("java", "-Xms1024M", "-Xmx1024M", "-jar","%~dp0craftbukkit-0.0.1-snapshot.jar");   
processBuilder.directory(new File("./Bukkit/"));
final Process process = processBuilder.start();
```


----------



## KlemensyXYZ (27. Sep 2011)

```
"%ProgramFiles(x86)%\Java\jre6\bin\java.exe"
```
wird von eclipse rot unterstrichen.
Die Fehlermeldung ist:

```
Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )
```
ich denke mal das das mit den 
	
	
	
	





```
%
```
 zusammenhängt

kann man das nicht ganz weglassen und nur die 32 bit Variante ausführen?


----------



## Gast2 (27. Sep 2011)

Nö das liegt an den back slashes.
Pfade entweder per \\ oder / trennen.


----------



## KlemensyXYZ (27. Sep 2011)

ich habde das jetzt so:

```
ProcessBuilder processBuilder;
processBuilder=new ProcessBuilder("java", "-Xms1024M", "-Xmx1024M", "-jar","%~dp0craftbukkit-0.0.1-snapshot.jar");   
processBuilder.directory(new File("./Bukkit/"));
final Process process = processBuilder.start();
```
und bekomme folgenden Fehler:

```
java.util.NoSuchElementException: No line found
Exception in thread "pool-1-thread-1" java.lang.NullPointerException
	at bukkit_gui.ServerStarten$1.run(ServerStarten.java:54)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```
ich denke mal das der Scanner keine Ausgabe zum einlesen mehr bekommt.
Wie bekomme ich die denn wieder?


----------

