Batchdatei mit pause hängt

Status
Nicht offen für weitere Antworten.
S

scooterJava

Gast
Ich habe eine Batchdatei, die nach anderen Anweisungen zum Schluss den Befehl "pause" enthält, der zwingend erforderlich ist. Gedacht ist, dass diese Datei in einem Kommandofenster ausgeführt wird, damit der Benutzer die Ausgaben sehen und anschließend das Fenster schließen kann. An dieser Vorgehensweise kann nichts geändert werden.

Mein Problem ist, dass ich trotz verschiedener Versuche kein Kommandofenster (Java 5, Vista) angezeigt bekomme; die Batch hängt, weil sie auf den Tastendruck bei der pause-Anweisung wartet. In Java verwende ich folgenden Code:
Code:
Runtime runtime = Runtime.getRuntime();
Process process = null;
String ext = FileUtilities.getExtension( cmd );

if( true == ext.equalsIgnoreCase( "bat" ) | true == ext.equalsIgnoreCase( "btm" )
	| true == ext.equalsIgnoreCase( "cmd" ) )
{
	process = Runtime.getRuntime().exec( "cmd /c " + cmd, null, new File( cmdPath ) );
}
else
{
	// ...
}

final Reader stdout = new InputStreamReader( process.getInputStream() );
final Reader stderr = new InputStreamReader( process.getErrorStream() );
new Thread( new OutputPipe( stdout, System.out ) ).start();
new Thread( new OutputPipe( stderr, System.err ) ).start();

exitvalue = process.waitFor();
Wie man sieht, fange ich auch die Ausgabeströme ab (Zusatz nach Hilfe von Ebenius :) ).

Wie erhalte ich das benötigte Kommandofenster?
 

Ebenius

Top Contributor
Damit ich es richtig verstehe: Der Nutzer soll unbedingt das Kommandozeilen-Fenster sehen und am Ende eine Taste drücken? Oder ist das für den Anwendungsfall (aus Java starten) gar nicht wichtig, Du kannst/darfst/sollst nur die Skripte nicht ändern?

Nachtrag: Anmerkung zum Code oben: Das if-Statement sieht so besser aus und '||' ist für solche Abfragen besser und üblicher als '|'. Unterschiede findest Du im Sun Java Tutorial » Equality, Relational, and Conditional Operators heraus. [HIGHLIGHT="Java"]if( ext.equalsIgnoreCase( "bat" ) || ext.equalsIgnoreCase( "btm" )
|| ext.equalsIgnoreCase( "cmd" ) )[/HIGHLIGHT]
Wenn man Literale mit Variablen vergleicht macht man es am besten sogar so (keine NullPointerException möglich und meines Erachtens noch besser lesbar):
Code:
literal.equals(variable);
... also ...[HIGHLIGHT="Java"]if ("bat".equalsIgnoreCase(ext) || ...[/HIGHLIGHT]

Ebenius
 
Zuletzt bearbeitet:
S

scooterJava

Gast
Ja, der Nutzer MUSS das Kommandofenster sehen und dann anschließend die pause-Anweisung bestätigen können.

Und zum Literal: Intern ist verbindlich, dass meine Notation verwendet wird, damit deutlich wird, mit welchem Wahrheitswert verglichen wird. Wenn ich das vorgeschlagene Literal verwende, könnte ich für eine Negation auch "if (!"bat".equalsIgnoreCase(ext) || ..." schreiben. Wie du siehst, kann das "!" leicht übersehen werden, was bei "if (false == ...)" nicht der Fall ist.

"||" oder "|", in diesem Fall wohl Geschmackssache.
 
S

scooterJava

Gast
Hab gerade den Tipp bekommen, den Aufruf zu ändern.
Statt
Code:
process = Runtime.getRuntime().exec( "cmd /c " + cmd, null, new File( cmdPath ) );
sollte es heißen
Code:
process = Runtime.getRuntime().exec( "cmd.exe /k start " + cmd, null, new File( cmdPath ) );
Dann öffnet sich auch das Fenster. Außerdem muss für Batchdateien die Zeile
Code:
exitvalue = process.waitFor(); // <-- streichen!
entfallen. Bei der richtigen Variante werden zwei cmd.exe-Instanzen gestartet. Die zweite ("start ...") schließt sich nach der erfolgreichen Ausführung (Schließen des Kommandofensters) wieder, die erste bleibt zunächst offen. Da jedoch die Ausgabe abgefangen wird (OutputPipe), schließt sich auch die erste Instanz, sobald die beiden Threads ihre Arbeit getan haben. Wenn das waitFor() entfällt, kann das Java-Programm anschließend weiterarbeiten ...
 
S

scooterJava

Gast
@Ebenius: Gibt es die Möglichkeit, einen Beitrag als "gelöst" zu markieren, so wie im alten Forum?
 

thE_29

Top Contributor
Nana!
Der Unterschied ist schon groß!

Einfache Operator werden WEITER ausgeführt!

Hier ein Bsp.:
[HIGHLIGHT="Java"] private boolean ble()
{
System.out.println("BLE");
return true;
}

private boolean blu()
{
System.out.println("BLU");
return true;
}
[/HIGHLIGHT]

Wenn man jetzt das hier macht:

[HIGHLIGHT="Java"] if(ble() | blu());[/HIGHLIGHT]

So ist die Ausgabe:

Macht man aber: [HIGHLIGHT="Java"] if(ble() || blu());[/HIGHLIGHT]
So ist die Ausgabe nur:

Das trifft bei && und & auch zu! && würde ja aufhören sobald was falsch ist! & macht es aber weiter!

Also aufpassen
Weil sowas hier geht:
[HIGHLIGHT="Java"]if(list != null && list.length > 0);[/HIGHLIGHT]
Würde OK sein! Hingegen das hier:
[HIGHLIGHT="Java"]if(list != null & list.length > 0);[/HIGHLIGHT]
Liefiert dir ne schöne NullPointerException weil er die Länge von einem Nullobjekt abfragen will ;)

Aber die Operatoren sind natürlich auch für Bitweise verknüpfen ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R JAR aus Batchdatei Aufruf Allgemeine Java-Themen 4
C Batchdatei ausführen und Ergebnisse abfragen Allgemeine Java-Themen 8
G Batchdatei zum Programmstarten Allgemeine Java-Themen 8
C Java Script Pause berechnen Allgemeine Java-Themen 5
M Nanosekunden-Pause innerhalb einen Thread-Loops Allgemeine Java-Themen 3
T [TimerTask] Pause Allgemeine Java-Themen 5
P JMF - Video Pause und Einzelbildweiterschaltung Allgemeine Java-Themen 2
L eine Pause in ein Programm einbauen? Allgemeine Java-Themen 10
A Eclipse hängt sich auf Allgemeine Java-Themen 7
Viper13125 Eclipse Hängt sich auf, wenn ich SimpelDateFormat drin lasse Allgemeine Java-Themen 2
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
N Quicksort Programm hängt sich auf Allgemeine Java-Themen 6
kodela Programm hängt in der Ereigniswarteschlange Allgemeine Java-Themen 13
S Programm hängt sich manchmal (selten) auf Allgemeine Java-Themen 9
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
Z Eclipse hängt sich alle paar Sekunden auf (Keine Rückmeldung). Allgemeine Java-Themen 4
F JavaFX Gui hängt counter++ Allgemeine Java-Themen 0
L Prog läuft in der IDE, hängt sich aber am Mac auf Allgemeine Java-Themen 0
1 InputStream hängt Allgemeine Java-Themen 4
P Threads Programm hängt Allgemeine Java-Themen 9
Jats Programm mit CMD Befehl hängt sich auf oder gibt error = 5 aus Allgemeine Java-Themen 4
T Programm hängt sich auf Allgemeine Java-Themen 14
J Eclipse Eclipse hängt sich ständig auf Allgemeine Java-Themen 6
P J2EE EJB Einstieg - hängt schon am XDoclet + Eclipse Allgemeine Java-Themen 5
L Java Thread [blockingqueue] hängt sich auf Allgemeine Java-Themen 13
S Element aus ArrayListe löschen --> Thread hängt sich auf Allgemeine Java-Themen 2
lacyuu Schleife hängt sich auf, wieso?? Allgemeine Java-Themen 2
J XML: JDOM + builder.build() hängt einfach Allgemeine Java-Themen 3
H Java Mail hängt sich unregelmässig auf Allgemeine Java-Themen 8
J Merkwürdiger Fehler: Applikation hängt einfach, Quartz-bug? Allgemeine Java-Themen 6
J process.getInputStream() hängt auf merkwürdige Art und Weise Allgemeine Java-Themen 7
D runtime.exec --> Prozess hängt sich auf Allgemeine Java-Themen 7
D new File() -> Java hängt sich manchmal auf Allgemeine Java-Themen 14
G Prozess beenden, wenn er hängt Allgemeine Java-Themen 9
S Runtime.getRunTime().exec("jar cvf .) hängt sich auf Allgemeine Java-Themen 3
M BufferedReader input - hängt sich auf Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben