Ausführen einer Batch mit Parameterübergabe funktioniert nicht richtig

buggy84

Bekanntes Mitglied
Hallo Java-Forum Gemeinde,

ich bin auf ein mehr oder weniger großes Problem gestoßen, ich hoffe eventuell kennt jemand eine Antwort.

Ich möchte eine Batch aus meiner Java-Applikation starten. Der Batch muss ich einen Parameter übergeben, welchen, erschließt sich für euch:

Java:
 Runtime.getRuntime().exec(new String[] { "cmd","/c","javafix.lnk",System.getProperty("java.home")} );

Prinzipiell geht das auch, allederdings nur, wenn
Java:
 System.getProperty("java.home")
einen Pfad ohne Leerzeichen liefert. Sobald der Pfad ein Leerzeichen enthält, geht das CMD-Fenster auf und sofort wíeder zu... schwer zu beschreiben, die Batch bricht sofort ab.

Kennt jemand das Problem?
Für jede Hilfe und Anregung bin ich dankbar.
 

Androbin

Bekanntes Mitglied
Problem: Durch Leerzeichen getrennt gilt dein Parameter als zwei einzelne Parameter

==> Lösung: Der Parameter muss durch Anführungszeichen zusammengefasst werden

==> ==> Problem: Anführungszeichen markieren in Java für einen String

==> ==> ==> Lösung: Schreibe die Anführungszeichen (um den Parameter) mit Backslash: \"
 
Zuletzt bearbeitet:

buggy84

Bekanntes Mitglied
Soweit klar. Der Ansatz funktioniert leider trotzdem nicht.
Alles in allem könnte mein Parameter ja auch als 2 (oder mehrere) Parameter gelten, die Batch sollte trotzdem funktionieren.
 
Zuletzt bearbeitet:

arilou

Bekanntes Mitglied
Ruf' erst mal diese "javafix.lnk" mit den Problemparametern direkt auf (ohne eigenes Java-Programm drumrum, ohne cmd.exe drumrum) in einer Ms-Dos-Eingabebox. Vielleicht ist ja "alles korrekt" am Aufruf, und das via .lnk gestartete Programm selbst endet eben unerwartet schnell?

Wenn das problemlos fuktioniert, kannst' anschließend mal (aus der Ms-Dos-Box) die
cmd /c
-Variante aufrufen, und austüfteln wie das genau funktioniert.

Erst danach würde ich anfangen, den Aufruf in Java durchführen zu wollen.

Außerdem bietet es sich an: Runtime.getRuntime().exec(...) liefert eine Process-Objekt zurück, dessen .getOutput und .getError -Streams solltest du aufnehmen und nachsehen, was darin ausgegeben wird.
 

buggy84

Bekanntes Mitglied
Die Batch (Ziel der .lnk) arbeitet gut, ich habe das mehrfach mit verschiedenen Tests bewiesen. Hier ist alles ok.

Was das "austüftlen" mit cmd /c angeht, weiß ich nicht genau was du damit meinst. Was ich benutze ist die gängige Art und Weise. Oder bist du da anderer Meinung? Hast Du andere Vorschläge?

Das Process-Object und die angeboteten Streams werde ich prüfen, danke für den Hinweis.

edit:

Ergebnis:

Java:
 ErrorStream java.io.FileInputStream@1c98360
OutputStream java.io.BufferedOutputStream@d03350
 
Zuletzt bearbeitet:

taro

Bekanntes Mitglied
Folgendes sollte es bei dir tun:

Java:
 Runtime.getRuntime().exec(new String[] { "cmd","/c","javafix.lnk",System.getProperty("\"java.home\"")} );

Alles in allem könnte mein Parameter ja auch als 2 (oder mehrere) Parameter gelten
Könnte zwar, sollte aber nicht - Funktionsweise überdenken!
 
Zuletzt bearbeitet:

buggy84

Bekanntes Mitglied
Folgendes sollte es bei dir tun:

Java:
 Runtime.getRuntime().exec(new String[] { "cmd","/c","javafix.lnk",System.getProperty("\"java.home\"")} );


Das funktioniert nicht... Sollte aber klar sein. Ich habs trotzdem ausprobiert, das Ergebnis war das zu erwartende.


Könnte zwar, sollte aber nicht - Funktionsweise überdenken!
2x Konjunktiv = keine Aussage
Damit kann ich nichts anfangen, mehrere Beispiele im Netz belegen, dass es funktioniert, die ich in der Batch aber eben mehrere Parameter auszuwerten habe (je nach Anzahl der Leerzeichen...).
 
Zuletzt bearbeitet:

taro

Bekanntes Mitglied
sorry ... knapp daneben:

Java:
 Runtime.getRuntime().exec(new String[] { "cmd","/c","javafix.lnk","\""+System.getProperty("java.home")+"\""} );

Jetzt aber

EDIT: Bitte daran denken, dass du den "Rest" des Pfades sowie den Namen der Datei direkt an den String hängen musst!
Java:
 Runtime.getRuntime().exec(new String[] { "cmd","/c","javafix.lnk","\""+System.getProperty("java.home")+"\\rest\\des\\pfades\\batch.lnk\""} );
 
Zuletzt bearbeitet:

buggy84

Bekanntes Mitglied
Hi taro,

danke für deine Mühe. Mit

Java:
 System.getProperty("java.home")

bekomme ich das Installtionsverzeichnis von Java zurück. Mehr brauch ich nicht als Parameter. Wozu ist "der Rest des Pfades" gut? Was übersehe ich denn hier? Langsam verzweifle ich ein bisschen.
 

taro

Bekanntes Mitglied
Man nutzt exec eigentlich, um eine externe Datei auszuführen - die musst du aber auch angeben - nur ein Pfad (in deinem Falle das Java-Homeverzeichnis) reicht da nicht - woher soll das System wissen, dass du die Angabe mit einer Batch verarbeiten willst, wenn du diese nicht angibst.

Normalerweise müsste die Befehlszeile so aussehen:

cmd /c "<Pfad>\irgendetwasausführbares.bat" <irgendwelche_Parameter>

das vermisse ich aber bei dir.
 

buggy84

Bekanntes Mitglied
Das ist nicht ganz korrekt. Eine Pfadangabe ist nur dann notwendig, wenn die auszuführende Datei in einem anderen Ordner als
Java:
 System.getProperty("user.dir")
liegt. Das ist bei mir nicht der Fall, daher reicht
Java:
 "cmd","/c","javafix.lnk"
aus. Meine Pfadangabe ist der Dateiname.

Java:
 System.getProperty("java.home")
ist der Parameter, den ich übergeben will...

Ganz im Übrigen führe ich eigentlich eine Verknüpfung aus. Die Verknüpfung zeigt auf die Batch.
 
Zuletzt bearbeitet:

arilou

Bekanntes Mitglied
Wenn alle Stricke reißen, schreib' doch das, was du ausführen willst, erst in eine Batchdatei, und start's dann:
Java:
void runIt() throws IOException
{
  BufferedWriter bw = new BufferedWriter( new FileWriter ( "mybatch.bat" ) );
  bw.write( "javafix.lnk \""+System.getProperty("java.home")+"\"" );
  bw.newline();
  bw.flush(); bw.close() ;
  Runtime.getRuntime().exec( "cmd" , "/c" , "mybatch.bat" );
}
Nicht schön, aber ein Problem weniger.
 
Zuletzt bearbeitet:

Thallius

Top Contributor
sorry ... knapp daneben:

Java:
 Runtime.getRuntime().exec(new String[] { "cmd","/c","javafix.lnk","\""+System.getProperty("java.home")+"\""} );

Jetzt aber

EDIT: Bitte daran denken, dass du den "Rest" des Pfades sowie den Namen der Datei direkt an den String hängen musst!
Java:
 Runtime.getRuntime().exec(new String[] { "cmd","/c","javafix.lnk","\""+System.getProperty("java.home")+"\\rest\\des\\pfades\\batch.lnk\""} );

Ja und da sind wir dann wieder bei dem Thema File.seperator.

Niemals und wirklich niemals Pfade selber mit \ oder / zusammen bauen.

Gruß

Claus
 

taro

Bekanntes Mitglied
@Thallius: Grundsätzlich hast du recht(!) - da jedoch eine Verknüpfung per lnk-Datei nur unter Windoof funktioniert ....
 

arilou

Bekanntes Mitglied
Das ist doch auch keine Lösung.

Lass dir doch mal die Systemmeldung dazu ausgeben ... wie es geht, findest du hier: https://blog.art-of-coding.eu/executing-operating-system-commands-from-java/ (Input and Output)

1. Es ist eine Lösung, die funktioniert. Nicht sehr schön, aber tut erst mal.
2. Dein Link erklärt allgemein, wie man .exec verwendet, aber auf das konkrete Problem des TO geht er in keinster Weise ein und ist somit hier nicht wirklich hilfreich.

Noch dazu wird dort Unsinn gemacht, wie z.B. in stdout eines Unterprozesses nach dessen Ende noch was hinzuzufügen ?!? Der einzig sinnvolle Schreibvorgang auf Datenströme eines Unterprozess' wäre, in dessen stdin etwas zu schreiben - aber nicht, nachdem man mit .waitFor() auf sein Ende gewartet hat.

Und stdout und stderr eines Unterprozesses sollte man nebenläufig aus seinen Datenströmen pollen, da Java nur 64k puffert, und dann den Unterprozess schlafen legt, bis die Puffer geleert sind - und sei's bis Sankt Nimmerlein.
Sowas kann man dem Hilfslink ebenfalls nicht entnehmen.
 

buggy84

Bekanntes Mitglied
taro hat gesagt.:
Lass dir doch mal die Systemmeldung dazu ausgeben ...

Das werde ich machen...

Thallius hat gesagt.:
Ja und da sind wir dann wieder bei dem Thema File.seperator.

Niemals und wirklich niemals Pfade selber mit \ oder / zusammen bauen.

Da stimme ich zu. Nur Ärger mit der Hardcodiererei.


arilou hat gesagt.:
Wenn alle Stricke reißen, schreib' doch das, was du ausführen willst, erst in eine Batchdatei, und start's dann

Wenn alle Stricke reißen, hast du selbstverständlich recht, wird ich es so (oder abgewandelt) lösen müssen. Das ist dann aber nur eine Behandlung der Symptome, keine wirkliche Lösung. Ich würde wirklich gern wissen was das Problem ist.

edit:

Ich hab mir den link von taro jetzt angeschaut. In Zukunft werde ich, bevor ich große Versprechungen mache

buggy84 hat gesagt.:
Das werde ich machen...
solche Links ansehen und dann entscheiden. Das ist, wegen Nutzlosigkeit, gestrichen. Bringt mich nicht wirklich weiter.

edit2:

buggy84 hat gesagt.:
keine wirkliche Lösung
revidiere ich ebenfalls. Im Grunde ist es eine Lösung und damit
arilou hat gesagt.:
ein Problem weniger
Dennoch bin ich bestrebt den Fehler meines Ansatzes zu finden, nur so vermeide ich das nächste Mal wieder ewig frustriert zu sein. Ich kann nicht schlafen, wenn ich das nicht in den Griff kriege...
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Ausführen einer .JAR Datei Allgemeine Java-Themen 5
S NoSuchMethodError beim Ausführen einer C Methode über JNI Allgemeine Java-Themen 5
Gossi Java Code in einer GUI eingeben und ausführen? Allgemeine Java-Themen 2
J Funktion zu einer Uhrzeit/datum ausführen Allgemeine Java-Themen 4
N JAR Datei ausführen unter Angabe einer speziellen Klasse Allgemeine Java-Themen 2
J Jar zu einer bestimmten Uzeit Ausführen Allgemeine Java-Themen 8
A Probleme mit dem Ausführen einer .bat Allgemeine Java-Themen 22
W Probleme beim Ausführen einer Java Klasse auf Kommandozeile Allgemeine Java-Themen 17
G Fehler beim Ausführen einer Applikation Allgemeine Java-Themen 4
H Funktion aus einer anderen Klasse ausführen Allgemeine Java-Themen 3
E Source-Code aus einer Textdatei kompilieren und ausführen Allgemeine Java-Themen 4
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
S Buttons nacheinander ausführen Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
P Bat Datei in Java ausführen Allgemeine Java-Themen 2
J Jar-Datei ausführen Allgemeine Java-Themen 7
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
F jar File ausführen Allgemeine Java-Themen 14
Hatsi09 Jar datei ausführen verursacht NumberFormatException Allgemeine Java-Themen 9
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
J CMD Befehl in Java Consolenprogramm ausführen Allgemeine Java-Themen 6
L Python in Java ausführen Allgemeine Java-Themen 4
L Eclipse Java Code ausführen Allgemeine Java-Themen 18
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
N Script mit Java ausführen Allgemeine Java-Themen 21
F Java automatisch ausführen Allgemeine Java-Themen 3
J Alle Unit Tests in Maven Modul Projekt ausführen Allgemeine Java-Themen 7
D Verknüpfung mit Java Ausführen Allgemeine Java-Themen 1
H jar-Datei mit java.exe anstatt mit javaw.exe ausführen Allgemeine Java-Themen 9
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Classpath Java App ausführen Allgemeine Java-Themen 2
Javafan01 .sh datei in Java ausführen Allgemeine Java-Themen 1
Javafan01 Ausführen Allgemeine Java-Themen 1
das_leon Hotkey ausführen Allgemeine Java-Themen 1
A Input/Output VBS-Datein mit Java Ausführen Allgemeine Java-Themen 2
K Server mieten, Berechnungen darauf ausführen Allgemeine Java-Themen 14
L HTML Formular ausführen Allgemeine Java-Themen 1
Tommy Nightmare Ausführen von CMD Befehlen Allgemeine Java-Themen 10
H .Sh Datei ausführen programmieren Allgemeine Java-Themen 5
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
M *.class Files ausführen Allgemeine Java-Themen 2
J Batch datei öffnen und als Admin ausführen Allgemeine Java-Themen 43
J Ältere applets ausführen? Allgemeine Java-Themen 0
A Linux bash script ausführen Allgemeine Java-Themen 16
Viktim Bash Script in Java ausführen Allgemeine Java-Themen 6
J While Schleife ausführen bis Zahl = X Allgemeine Java-Themen 19
T Programme ausführen.. Allgemeine Java-Themen 3
H Java Anwendungen ausführen Allgemeine Java-Themen 3
T Während des Programmlaufs andere Programme ausführen Allgemeine Java-Themen 1
T .jar über cmd ausführen (später dann batch) Allgemeine Java-Themen 6
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
Fischkralle Ausführen von fremden Code Allgemeine Java-Themen 14
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
T Git-Befehle mit Java ausführen Allgemeine Java-Themen 5
Neumi5694 Datei mit erhöhten Rechten ausführen Allgemeine Java-Themen 2
Bananabert Java mit bestimmter GPU ausführen Allgemeine Java-Themen 7
F Mencoder unter Java Ausführen Allgemeine Java-Themen 0
L Jar-Datei in Web ausführen Allgemeine Java-Themen 1
U CMD Befehle als Admin ausführen Allgemeine Java-Themen 6
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
D swingset3.jnlp lässt sich nicht ausführen Allgemeine Java-Themen 2
S Shell Commands mit absolutem Pfad ausführen Allgemeine Java-Themen 2
G Umgebungsvariable Jar im Netzlaufverk ausführen Allgemeine Java-Themen 4
K Eclipse Fehler beim Ausführen meines Programms in Eclipse Allgemeine Java-Themen 11
F paintComponent() nicht automatisch ausführen? Allgemeine Java-Themen 5
G while Schleife ausführen solange eine Taste gedrückt ist Allgemeine Java-Themen 14
M Java Anwendung ausführen Allgemeine Java-Themen 5
J Code ausführen bei JVM-Zerstörung Allgemeine Java-Themen 15
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
Hoppelmann Befehlszeile an bestimmtem Ort ausführen Allgemeine Java-Themen 2
M Befehl in Runtime ausführen der Eingabe benötigt Allgemeine Java-Themen 3
C Rechnung genau 8 mal ausführen Allgemeine Java-Themen 5
aze Jar ausführen über Runtime.execute funktioniert nicht Allgemeine Java-Themen 4
C Umgebungsvariable Java-Datei in anderem Verzeichnis ausführen Allgemeine Java-Themen 2
F Jar auf Netzlaufwerk ausführen Allgemeine Java-Themen 2
D Code später ausführen Allgemeine Java-Themen 8
Wirago (runnable) JAR-File ausführen Allgemeine Java-Themen 6
S Fehler beim ausführen des HTML Allgemeine Java-Themen 7
T jar Archiv auf Server ausführen Allgemeine Java-Themen 3
J CMD direkt in Java ausführen Allgemeine Java-Themen 11
B UNIX Shell befehl über JavaCode ausführen Allgemeine Java-Themen 19
J Threads Methode in Mainthread ausführen Allgemeine Java-Themen 5
A Jasperreports automatisch ausführen lassen Allgemeine Java-Themen 5
P jar-Datei lässt sich nicht ausführen Allgemeine Java-Themen 5
T Junit-Tests in Java Klasse ausführen Allgemeine Java-Themen 26
R Jar Datei ausführen Allgemeine Java-Themen 7
J Java programm lässt sich in win7 nach linux install nicht mehr ausführen Allgemeine Java-Themen 18
L Java Quellcode auf Windows 7 ausführen? Allgemeine Java-Themen 3
J Java Datei ausführen Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben