Echo aus .bat lesen

armbruch

Mitglied
Hi zusammen

Ich komm' mir grad ziemlich dumm vor, trotzdem hab' ich es nicht hingekriegt, aus einer einfachen .bat Datei das echo rauszulesen.

Hier mal die test.bat
Code:
echo "hallo"
pause

Und hier die Java Methode
Java:
public String start(String path)		{
	String result = new String();
	try		{
		Process process = Runtime.getRuntime().exec(path);
		process.getOutputStream().close();
		BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
		
		
		String line;
		System.out.println("start reading");
		while((line=reader.readLine())!= null && line.length() > 0)		{
			System.out.println(line);
			result += line+"\n";
		}
		System.out.println("end reading");
	}
	catch(Exception e)		{
		System.out.println("error");
		result = "fehler";
	}
	return result;
}

Aufgerufen wird das ganze mit folgendem Java code:
Java:
String str = starter.start("cmd c:\\pfad\\test.bat");

In dem guten String str steht allerdings nichts, die Frage ist wieso :D. Es ist gut möglich, dass da der ein- oder andere Fehler drin ist, jedoch funktioniert das ganze, wenn man echos von einem Powershellscript lesen möchte.

Ich hoffe, jemand kann mir da weiterhelfen :)
 
Moin,

so spontan kann ich keinen echten Fehler sehen, aber hier mal ein Beispiel, mit dem ich über den ProcessBuilder und "ipconfig" eine MAC-Adresse auslese ... vlt. hilft Dir das ja weiter :
Java:
		  // ###########################################################################
		  // Auslesen der MAC-Adresse
		  // ###########################################################################
		  ProcessBuilder pb = new ProcessBuilder( "ipconfig", "/all" );
		  pb.redirectErrorStream( true );
		  Process proc1 = pb.start();
		  proc1.getOutputStream().close();
		  BufferedReader readerIN = new BufferedReader( new InputStreamReader(proc1.getInputStream()) );
	    		 
		  String strLine = "";
		  String strMACAdr = "";
		  
		  // suchen des letzten Eintrags "Physikalische Adresse"
		  while( (strLine = readerIN.readLine()) != null ) 
		  {
			  if( strLine.trim().startsWith("Physikalische Adresse") )
			  {
				  strMACAdr = strLine.trim().substring( 36 );
				  if( strMACAdr != "" ) 
				  {
					  setMACWin( strMACAdr );
				  }
				  else 
				  {
					  setMACWin( "00-00-00-00-00-00" );
				  }
			  }
		  }
		  System.out.println( "MAC-Adresse: <" + strMACAdr  + ">");

EDIT:
und noch ein anderes Beispiel zum Auslesen der Volume-ID:
Java:
	      // ###########################################################################
	      // Auslesen der Volume-ID
	      // ###########################################################################
		  Process proc2 = Runtime.getRuntime().exec( "cmd /C dir" );
		  InputStreamReader input = new InputStreamReader( proc2.getInputStream() );
		  BufferedReader in = new BufferedReader( input );
		  String line = "";
		  int count = 0;
		  while( (line=in.readLine()) != null )
		  {
			  count++;
			  if( count < 2 )
			  {
				  continue;
		      }
				
			  if( count > 2 )
			  {
				  break;
			  }
			  String strVolID = line.substring( line.lastIndexOf(' ') + 1 );
			  setVolID( strVolID );
			  System.out.println( "Volume-ID: <" + strVolID  + ">" );
		  }

Gruß
Klaus
 
Zuletzt bearbeitet:
Vielen Dank, deine zweite Variante hat funktioniert, habe sie noch ein bisschen für meine Zwecke optimiert :)

Wieso die erste Version nicht funktioniert, steht in den Sternen... Vermutlich liegt es am OS des Servers.
 
Die Version mit startsWith("Physikalische Adresse") hat bei mir nicht funktioniert, da ich ein englisches OS verwende. Nachdem ich aber den String mit startsWith("IP Address") ersetzt habe, wurde auch die richtige IP Adresse ausgegeben.
 
Ah, ok - Du kannst ja den Befehl einfach mal im CMD-Fenster ausführen (und eine Datei umlenken). Dann siehst Du alle Einträge mit den entsprechenden Bezeichnung :)

ipconfig /all > c:\XYZ.txt

Gruß
Klaus
 
Am Befehl lag es nicht, den habe ich einerseits umgeschrieben, andererseits auch manuell ausprobiert, dann hat er funktioniert.. ;) Ich habe mich natürlich nur an Befehle gehalten, die vom OS unterstützt werden.

Aber vielleicht kennt einer von euch den genauen Unterschied - ausser dem Offensichtlichen - zwischen den beiden Varianten. Ich wäre da ganz Ohr :p
 
Hi.

Vielleicht kannst du mal sagen was der Unterschied war (was ging denn nicht? kein Resultat, nicht das erwartete, Exceptions?), damit man nicht so im Nebel rumstochern muss.

Und vor allen Dingen sagen was du geändert hast?

Und du beziehst dich auf die 2 Codeschnipsel von vfl_freak, richtig?

Hast du mal ohne redirectErrorStream probiert?

Gruß
 
Hi

Bei der getRuntime.exec() Methode kam gar nichts zurück. Ich gehe davon aus, dass das aufzurufende Script nicht korrekt aufgerufen wurde.

Naja die Änderung ist doch klar ersichtlich: Ich habe die Runtime-Geschichte durch die ProcessBuilder-Sache ersetzt :) Code kann ich leider nicht zeigen, da ich schon extrem viele weitere Änderungen am Code vorgenommen habe und eine schöne Gegenüberstellung in meinen Augen nicht wirklich möglich ist.
 
Hi.
Bei der getRuntime.exec() Methode kam gar nichts zurück. Ich gehe davon aus, dass das aufzurufende Script nicht korrekt aufgerufen wurde.
Allerdings.

Du hast den /c Schalter vergessen. Ohne ihn, führt cmd das Batch Skript überhaupt nicht aus.

Weiterhin brichst du ab sobald eine Leerzeile gelesen wird. Bei mir wird immer eine Leerzeile gleich zum Anfang der Skriptausführung ausgegeben, so das dann natürlich die Schleife sofort abgebrochen wird. D.h. du solltest den /q Schalter verwenden.

Code:
cmd /q /c pfad/zu/hallo.bat
Gruß
 
Zurück