• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Frage an die Java-Programmierer

Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
Nabend.

Ich habe ein großes Problem, mit dem ich mich jetzt schon seit einigen Stunden rumschlage und ich komme einfach nicht weiter. Ich hoffe, jemand von Euch hat ne Idee, was ich falsch mache.

Also: Ich versuche aus meinem Java-Programm heraus eine Batch-Datei aufzurufen. Dazu benutze ich den Befehl
Process p = Runtime.getRuntime().exec(...);
p.waitFor();

Hiermit kann ich auch wunderbar "normale" Executables ausführen. Wenn ich allerdings versuche ein Batch-File auszuführen, in dem bestimmte Operationen vorgenommen werden - beispielsweise das wechseln eines Verzeichnisses mit "cd .." - dann führt er das Batch-Skript genau bis zu dieser Stelle aus und verharrt dann endlos bei diesem Befehl.

Beispiel:
Das folgende Batch-Skript

echo HelloWorld >Test.txt
echo HelloWorld2 >Test2.txt
cd..
echo HelloWorld3 >Test3.txt


Führt er genau bis zum "cd.." aus. Der letzte befehl wird nich mehr ausgeführt. Stattdessen hält er bei der WaitFor() Anweisung an und läuft einfach nicht mehr weiter...

Woran kann das bitte liegen? Mache ich evtl. beim Aufruf was falsch?
Ich rufe das Batch-File mit
Runtime.getRuntime().exec(BATCH_FILE_NAME, null, new File(PATH_TO_BATCHFILE));
auf.

Würde mich über jede Hilfe freuen, bin nämlich grad am verzweifeln.
Thx

m.a.k.
 

Bronzegraf

Guest
Hast Du ausprobiert, ob Deine batch-Datei in der Konsole das macht, was Du Dir erhoffst?

Edit: Kann es vielleicht sein, dass das Arbeitsverzeichnis nicht mit dem übereinstimmt, wo Du es eigentlich haben willst? Ich vermute mal, dass das Arbeitsverzeichnis (auf das sich "cd" bezieht) nicht identisch mit dem Pfad zur batch-Datei ist. Versuch mal in die batch-Datei noch folgendes einzubauen:
Code:
for %%i in (%0) do cd %%~di%%~pi
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
Moin.

Original geschrieben von Bronzegraf
Hast Du ausprobiert, ob Deine batch-Datei in der Konsole das macht, was Du Dir erhoffst?

ja, wenn ich das teil von der konsole aus aufrufe, funktioniert es wunderbar.

Original geschrieben von Bronzegraf
Edit: Kann es vielleicht sein, dass das Arbeitsverzeichnis nicht mit dem übereinstimmt, wo Du es eigentlich haben willst? Ich vermute mal, dass das Arbeitsverzeichnis (auf das sich "cd" bezieht) nicht identisch mit dem Pfad zur batch-Datei ist.

doch, doch - das passt. habe ich verifiziert, indem ich mit echo ein %CD% in eine datei-geschrieben habe.

nach einigen weiteren tests heute morgen muss ich auch zugeben, dass ich gestern auf der falschen fährte war.
vielmehr vermute ich ein anderes problem: irgendwie scheint Java probleme damit zu haben, die batch-files richtig zu interpretieren...

momentan ist das ganze für mich noch sehr kurios und ich kann es auch noch nicht vollständig nachvollziehen, aber hier nochmal ein beispiel:

ich habe zwei batch-dateien,

datei1 (test1.bat):
echo Before >Before.txt
call test2.bat
echo After >After.txt


datei2 (test2.bat):
echo HelloWorld >test1.txt
echo HelloWorld2 >test2.txt
echo %PATH% >test3.txt
echo HelloWorld3 >test4.txt


wenn ich die erste Datei aus der Kommandozeile heraus aufrufe, dann läuft alles wunderbar, es werden alle Dateien sauber angelegt.

wenn ich das ganze aber aus java heraus mit folgendem aufruf mache:

Process p = Runtime.getRuntime().exec("D:\\test\\MVPBS\\utilities\\monitor\\temp\\test1.bat", null, new File("D:\\test\\MVPBS\\utilities\\monitor\\temp"));
nExitValue = p.waitFor();


dann hängt er in einer endlosschleife bei der waitFor() Anweisung fest und legt die letzten beiden Dateien - also test4.txt und After.txt nicht mehr an.

das hat imho was mit dem %PATH% aufruf zu tun. wenn ich diesen z.B. durch %CD% ersetze, habe ich genau das gleiche problem.

wenn ich den aufruf echo %PATH% >test3.txt kopiere und zusätzlich noch in die erste Zeile der ersten Datei setze, dann führt er das ganze sogar nur bis zur erstellung von datei test2.txt aus, und hört dann auf. das selbe, wenn ich die zeile dorthin kopiere und mit rem auskommentiere.

ich kann mir da echt keinen reim drauf machen. vielleicht hat ja jemand von euch ne idee...

ach, bevor ich es vergesse: hab natürlich auch schon versucht, die batch-datei anders aufzurufen, nämlich mit cmd /C <BatchFile>, hat aber auch nichts gebracht...

also dann, plz help... :confused:
 

Shihatsu

Administrator
Mitglied seit
26.09.2001
Beiträge
49.590
Reaktionen
10.238
Na super, endlich mal was interessantes und ich hab keine Zeit zum frickeln :mad:

Helfts dem Jungen und ihr habt einen gut bei mir :D
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
also mit nem bash skript funktionierts, aber das wird dir wohl eher nicht helfen...
 

killerchicken_inaktiv

Guest
Das Problem liegt an streambuffern, hier ein quote aus der Java-Doku:

Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.

auf Javaworld hab ich folgende Klasse gefunden, die dir helfen sollte:

Code:
import java.util.*;
import java.io.*;
class StreamGobbler extends Thread
{
    InputStream is;
    String type;
    
    StreamGobbler(InputStream is, String type)
    {
        this.is = is;
        this.type = type;
    }
    
    public void run()
    {
        try
        {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
                System.out.println(type + ">" + line);    
            } catch (IOException ioe)
              {
                ioe.printStackTrace();  
              }
    }
}

Das ganze machste dann ungefaehr so:
Code:
Process p = Runtime.getRuntime().exec("D:\\test\\MVPBS\\utilities\\monitor\\temp\\test1.bat", 
                   null, new File("D:\\test\\MVPBS\\utilities\\monitor\\temp"));

StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");            

StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT");

errorGobbler.start();
outputGobbler.start();
                                    

nExitValue = p.waitFor();
 
Mitglied seit
04.08.2002
Beiträge
1.869
Reaktionen
0
unverschämt - manchmal hab ich das gefühl du weißt alles killerchicken :top2:

das war die lösung meines problems, nun funktionierts einwandfrei!

also, in dem sinne, noch einmal :thx: an alle für die hilfe (und ganz besonders ans killerhuhn)
 

killerchicken_inaktiv

Guest
Joar also ich mach das nur um mich bei Dave einzuschleimen, weil ich das so besonders noetig habe!

:luv: an alle da draussen :D
 
Oben