# Externes Programm - Konsolenausgabe kopieren/sichtbar machen



## Jonnsn (4. Nov 2008)

Hi,

ich habe ein Programm dass ein externes Programm aufruft, welches eine Konsolenausgabe - ... ausgibt (  :bae: )
Mein java Programm ist im Grunde nur eine GUI dazu
Meine erste Idee war nun die Konsolenausgabe auf eine Textarea umzuleiten (bspw. so wie hier) - funktioniert an sich auch.

Nur - wenn ich das Programm in einer bestimmten Art aufrufe bekomme ich folgendes:

```
Failed to open 'javax.swing.JTextField[,5,27,400x25, -->[GEKÜRZT]<-- ,horizontalAlignment=LEADING]' : Failed to lock the file (16392).
```
Kann es sein, dass mein externes Programm versucht in seinen Output stream zu schreiben -> und damit in meine JTextarea, zuvor will es diese "Datei" exklusiv bekommen, was natürlich bei der JTextaArea nicht klappt.... ?
Wenn ja - gibts ne Möglichkeit das zu verhindern?
Wenn nein: weiß jemand worans sonst liegt?  :bahnhof: 

*An sich wäre das aber auch alles egal*, wenn mir nur jemand sagt, wie ich die Ausgabe des Programms direkt sichtbar mache    also das vom eigentlichen Programm kommende Konsolenfenster anzeige
Ich starte das Programm mit exec() (wenn ichs manuell starte, öffnet sich auch die Konsole ...)#

Danke!
(hoffe ich hab niemanden zu sehr verwirrt  ???:L  )

Gruß


----------



## thE_29 (4. Nov 2008)

Ich würde die Ausgabe vom Programm in eine Datei umleiten lassen und diese auslesen!

Da es bei getInputStream bei Prozessen manchmal zu einem Deadlock kommt und er nicht mehr weiterlesen kann (zumindest bei 1.4 war das ein bekannter Bug).

Ansonsten probiere mal

exec.("cmd /c PROGRAMM.exe");


----------



## The_S (4. Nov 2008)

@thE_29

Dein Deadlock Problem tritt genauso mit Java 1.6 auf - letztens erst probiert. Außerdem macht das vorallem dann Probleme, wenn man mehr liest, als das Programm bytes ausgegeben hat ???:L .


----------



## thE_29 (4. Nov 2008)

Jop!
Das ist ein bewusstes Problem von Java/Sun (dachte aber, dass die das geschafft haben).

Hab das mal irgendwo in einem BugTicker oder sonst wo gelesen. Anscheinend kriegens das nicht in Griff. Ich mache seitdem immer den Umweg über einer Datei. Außer es ist halt nur minimal output.


----------



## Jonnsn (4. Nov 2008)

thE_29 hat gesagt.:
			
		

> Ich würde die Ausgabe vom Programm in eine Datei umleiten lassen und diese auslesen!


Das wäre natürlich möglich, wenns was helfen kann - Problem wäre nur: wann/wie oft lese ich die Datei aus? Das Programm läuft ne weile - nur sollte ich mitbekommen wann es fertig ist...


			
				thE_29 hat gesagt.:
			
		

> exec.("cmd /c PROGRAMM.exe");


(Ohne Punkt nehme ich an) Das klappt bei mir leider nicht (es passiert nichts..) - wie müssten da Parameter angegeben werden?


----------



## thE_29 (4. Nov 2008)

Wie sieht den dein Aufruf vom Programm auf?

Bzgl, des auslesen der Datei! Einfach in einem Thread auslesen und alle XX Sekunden schaun ob was neues da ist!
Alternativ würde sich hier auch JNotify anbieten -> http://jnotify.sourceforge.net/
Download: http://sourceforge.net/projects/jnotify


----------



## Jonnsn (4. Nov 2008)

```
Runtime.getRuntime().exec("cmd /c "  + cmd)
```
wobei cmd ein String ist, der Programmpfad+name sowie parameter enthält...
etwa so:

```
C:\programm.exe -x bla blubb
```
Datei: ja so ist klar - die frage wäre wie ich da mitbekomme wann schluss ist... naja aber das ist erstmal zweitrangig - ich bastle gerade an der Umleitung in ne Datei


----------



## thE_29 (4. Nov 2008)

Also bei mir geht das Tip Top!


```
Runtime.getRuntime().exec("cmd /c C:\\programm.exe -x bla blubb");
```

Übergibt bei mir die Parameter an das programm.exe.


----------



## Gast (18. Dez 2008)

Hallo, ich hätte eine Frage. Was bedeutet -x in "Runtime.getRuntime().exec("cmd /c C:\\programm.exe -x bla blubb");"? Ist das auch ein Parameter?


----------



## The_S (18. Dez 2008)

Das ist ein Parameter für dein Programm.


----------



## Gast (18. Dez 2008)

Danke für die schnelle Antwort! Dazu noch eine kurze Frage. Warum werden einige Parameter mit der "-" Zeichen geschrieben?


----------



## @x.l (18. Dez 2008)

Das Minuszeichen kennzeichnet den Parameternamen danach kommt mit Leerzechen getrennt der Wert für diesn Parameter.


Kommando -paramName paramWert -andererParam paramWert


----------



## The_S (18. Dez 2008)

@x.l hat gesagt.:
			
		

> Das Minuszeichen kennzeichnet den Parameternamen danach kommt mit Leerzechen getrennt der Wert für diesn Parameter.
> 
> 
> Kommando -paramName paramWert -andererParam paramWert



Muss aber nicht zwingend so sein. Kann jedes Programm (bzw. jeder Programmierer) so handhaben, wie es möchte.


----------



## Gast (18. Dez 2008)

Hi! Ich würde mich freuen, wenn mir jemand helfen könnte. 
Ich habe folgendes Problem. Wenn ich mit JAVA ein externes Programm aufrufe (xxx.bat), das wiederum ein  yyy.bat aufruft, werden alle Kommandos in xxx.bat bis auf "call yyy.bat" ausgeführt. Genauer gesagt wird das yyy.bat nicht gestartet. Woran könnte es liegen?


----------



## @x.l (18. Dez 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Muss aber nicht zwingend so sein. Kann jedes Programm (bzw. jeder Programmierer) so handhaben, wie es möchte.


Da hast du recht, doch üblichlicherweise wird es so gehandhabt. Ist ja bei Tastaturkürzeln ähnlich - z.B. Strg+C -> steht ja auch in der Regel für Copy und nicht für Close.


----------



## The_S (18. Dez 2008)

wie startest du die erste .bat Datei? über "cmd /c start blub.bat"? Falls nein, mach das mal so.


----------



## The_S (18. Dez 2008)

@x.l hat gesagt.:
			
		

> Ist ja bei Tastaturkürzeln ähnlich - z.B. Strg+C -> steht ja auch in der Regel für Copy und nicht für Close.



Außer bei der Windows-Konsole, da bricht man mit STRG+C ab und kopiert nach markieren mit Enter :lol:


----------



## Guest (18. Dez 2008)

mit Strg+C beendet man AUCH unter windows (zum Glück) Programme auf (virtueller) shell ebene


----------



## @x.l (18. Dez 2008)

owned  :wink:


----------



## Gast (18. Dez 2008)

Ich habe schon versucht den Aufruf mit "start" durchzuführen, dabei wurde nur der "cmd" aufgemacht und es wird auf ein  Kommando gewartet, weiter läuft es automatisch leider nicht.

myProcess = Runtime.getRuntime().exec("cmd.exe /C start xxx.bat"


----------



## The_S (18. Dez 2008)

Damit gibts schon immer Probleme. Was macht denn deine bat-Datei, was dein Java Programm nicht machen kann?


----------



## Gast (18. Dez 2008)

Die .bat-Dateien sehen so aus:

test.bat

@ECHO OFF
ECHO. test                                       // läuft
call notepad                                     // läuft
call test_var.bat var1 var2 var3        // läuft nicht
ECHO. CHECK > X_Ausgabe_test.txt  // läuft




test_var.bat

@ECHO OFF
ECHO. Die Parameter werden uebergeben 
ECHO. test_var
call notepad     // läuft nicht
echo.%1
echo.%2
echo.%3
echo. Ausgabe neu > X_Ausgabe_testvar.txt  // läuft nicht, Datei nicht angelegt


----------



## Gast (18. Dez 2008)

Ich habe vergessen zu sagen, wenn ich das test.bat direkt aus dem Verzeichnis starte , dann läuft alles einwandfrei (test_var.wird auch korrekt durchgeführt)


----------

