it-swarm.com.de

Warum wird cmd nach Ausführung der Batchdatei nicht beendet?

Warum wird cmd nach Ausführung der Batchdatei nicht beendet?

Ich habe versucht:

"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

und

@echo off
"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
exit
23
Joe

Wenn die Java-App nicht beendet wird (z. B. verwenden Sie die Batch-Datei zum Starten der Java-App), starten Sie sie mit dem Befehl start:

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

Dadurch wird die Java-App gestartet und die Batch-Datei weiter ausgeführt, ohne auf die Beendigung der Java-App zu warten.

29
misterjaytee

Erklärung:

So funktioniert es; Eine Batch-Datei wird zeilenweise verarbeitet. Jeder Befehl wird nacheinander ausgeführt und der Stapelverarbeiter wartet, bis ein Befehl beendet ist, bevor er den nächsten startet. Das Problem besteht darin, dass die von Ihnen gestartete Java-Anwendung (Jilko.jar) ein Fensterprogramm ist, das auch nach dem Start der Zeile ausgeführt wird. Wenn es sich um ein Tool handelt, das eine Aktion ausführt und dann beendet wird, wird die Batchdatei mit dem nächsten Befehl fortgesetzt (oder beendet, wenn keine weiteren vorhanden sind). Da das Programm noch ausgeführt wird, wartet der Stapelverarbeiter, bis das Fenster geschlossen ist, bevor er fortfährt. Sie können dies in Aktion sehen, indem Sie das Java-Programm beenden: Das Konsolenfenster mit der Batch-Datei wird geschlossen.


Lösung:

Um das Problem zu beheben, müssen Sie den Stapelverarbeiter anweisen, das Programm zu starten und fortzufahren, ohne darauf zu warten:

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

Wie in Terrance erwähnt , ist der "" der Titel, der für das Konsolenfenster verwendet werden soll. Dies ist jedoch nur optional, wenn der Befehl nicht in Anführungszeichen steht. Andernfalls ist erforderlich . Sie können dort etwas einfügen, wenn Sie möchten, oder es leer lassen, aber wenn der Befehl in Anführungszeichen steht, muss er vorhanden sein. Andernfalls behandelt der Befehlsinterpreter den angegebenen Befehl als Titel und öffnet eine Konsole, die dort wartet etwas zu tun.

Sie können stattdessen den folgenden Befehl verwenden, die Anführungszeichen sind jedoch einfacher und sicherer, da die Kurznamen nicht auf allen Systemen garantiert gleich sind.

start C:\Progra~2\Java\jre6\bin\javaw.exe -Xmx1024M -Xms1024M -jar Jilko.jar

Der Befehl start ist ein integrierter Befehl, der einen Prozess erzeugt (im Grunde genommen wie das Ausführen eines Programms über das Startmenü). In diesem Zusammenhang führt der Stapelverarbeitungsprozessor den Befehl start aus, der seinerseits das angegebene Programm ausführt und beendet (selbst, nicht das erzeugte Programm). Der Batch-Prozessor wird daher wie erwartet fortgesetzt. Es gibt auch einige Optionen, die nützlich sein können, z. B. das Ausführen des Programms minimiert (/min) oder maximiert (/max), das Ausführen mit niedriger Priorität (/low) und so weiter. Siehe start /? für Details.

19
Synetech

Ich habe festgestellt, dass einige der Programme, die ich starte, Prozesse laufen lassen und das Konsolenfenster erst dann geschlossen wird, wenn sie beendet werden, wenn ich sie nur durch Starten der ausführbaren Datei starte.

Das START-Programm behebt das, aber das alte Problem mit START gibt es immer noch. Sie können nicht nur verwenden:

START "c:\my dir\myfile.exe"

Der erste Parameter von START ist immer noch der Fenstername. Wenn Sie es weglassen, öffnen Sie einfach eine CMD-Konsolenbox mit dem Namen des Fensters, das Sie zu starten versucht haben. In der obigen Instanz hätte ich jetzt ein Konsolenfenster mit dem Fenstertitel " c:\my dir\myfile.exe ". Nicht was ich wollte!

Um den Fensternamen wegzulassen, verwenden Sie einfach doppelte Anführungszeichen, um eine leere Zeichenfolge zu definieren, z.

START "" "c:\my dir\myfile.exe"

Beenden Sie Ihre Batch-Datei schließlich mit einem EXIT-Befehl, um sicherzustellen, dass sie geschlossen wird.

Diese Methode scheint in Windows 7 und 8 konsistent zu funktionieren.

Bei der Fehlersuche finde ich, dass das Hinzufügen eines ECHO von dem, was ich tun werde, und eines TIMEOUT von dem, was ich gerade getan habe, sehr hilfreich ist. Zum Beispiel:

ECHO I'm about to launch the program...
START "" "c:\my dir\myfile.exe"
TIMEOUT 5

Da das Timeout einen Countdown ausgibt, müssen Sie nicht ECHO ausführen, um zu verzögern.

6
AzDayton

Verwenden Sie unter Windows 7 immer EXIT , da es nicht unbedingt beendet werden muss, bis die Batch-Datei fertig ist in früheren Windows-Versionen. Windows 7 reagiert möglicherweise empfindlicher auf diese Probleme als frühere NT-Versionen (z. B. Windows 2000 Professional). Dies wurde in einigen , aber nicht in allen der vorherigen Antworten erwähnt.

Angaben zur persönlichen Erfahrung zur Unterstützung der Antwort:

Nach dem Übertragen einer StarOffice5.2-Installation von Windows 2000 auf Windows 7 wurden beim Beenden der Suite Speicherplatzfehler gemeldet. Dies wurde in Windows 2000 nicht gesehen.

Vor Jahren hatte ich Batch-Dateien geschrieben, um die Datei soffice.ini automatisch zu sichern und wiederherzustellen, damit bei Beschädigung eine Reparatur möglich ist (häufig genug, um ein Problem zu sein - die Suite kann nicht geladen werden). Die automatische Sicherung (ausgelöst durch einen Link zur Batch-Datei, die sich in Office52\user\config\startup befindet) erfolgt jedoch erst nach einer Verzögerung von 5 Sekunden. Ich bemerkte, dass die Beendigung der Suite ohne Fehler verlief, wenn ich die Suite kurz vor der Ausführung der Batchdatei verließ. Dies wies mich auf ein Problem in den Batch-Dateien hin.

Nachdem der Befehl 'EXIT' als letzte Zeile in den Stapeldateien eingefügt wurde, wurde die Office-Suite zu jeder Zeit ohne Speicherplatzfehlermeldungen beendet, unabhängig davon, ob die Stapeldateien ausgeführt wurden oder nicht.

5
RonCam

Sobald die App fertig ist, sollte sie beendet sein. Sind Sie sicher, dass die Java-App ordnungsgemäß beendet wird?

2
Azz

Ich habe mich nur mit dem gleichen Problem befasst und es hat sich schließlich von selbst gelöst, nachdem scheinbar zufällige Änderungen an der Batchdatei vorgenommen wurden. Ich verstehe nicht, warum, aber ich werde es hier posten, falls es später jemand anderem hilft.

Ich verwende das Dienstprogramm SysInternals Pskill und das Dienstprogramm sleep seit XP Home enthält nicht viel in Bezug auf die Befehlszeilenfunktionalität.


Dies ist die Batchdatei, die nach Abschluss des Vorgangs tatsächlich geschlossen wird:

@echo off
start /min C:\Progra~1\PsTools\pskill.exe Explorer.exe
start /min C:\Progra~1\PsTools\pskill.exe Powermenu.exe
start /min C:\Progra~1\PsTools\pskill.exe PWGen.exe
start /min C:\Progra~1\PsTools\pskill.exe redshiftgui.exe
start /min C:\Progra~1\PsTools\pskill.exe clipx.exe
sleep 2
start Explorer.exe
sleep 3
start C:\Progra~1\ClipX\clipx.exe
sleep 1
start C:\Progra~1\Powermenu\PowerMenu.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
start C:\Progra~1\RedshiftGUI\redshiftgui.exe && exit

Wenn ich die letzten Zeilen so geändert hätte, würde das Cmd-Fenster geöffnet bleiben, bis ich auf das 'X' in der Ecke klickte:

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe && exit

Selbst wenn ich versuchte, pskill aufzurufen, um sich selbst zu töten, verschwand der Prozess cmd.exe aus dem Task-Manager und pskill meldete in cmd.exe, dass der Prozess cmd.exe beendet wurde, das Fenster cmd.exe jedoch weiterhin aktiv war bis ich auf das 'X' in der Ecke geklickt habe:

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
C:\Progra~1\PsTools\pskill.exe cmd.exe

Nachdem ich && exit zu jeder Zeile hinzugefügt hatte, bemerkte ich, dass einige von ihnen darauf reagierten und die Stapelverarbeitung unterbrachen, während andere dies nicht taten.

Also habe ich einfach eine der reaktionsschnellen am Ende eingefügt, anstatt wie ich es ursprünglich hatte.

Wie gesagt, ich weiß nicht warum, bin aber froh, dass das vorbei ist.

2
NginUS

versuchen:

cmd /c "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

1

Ich habe nach einer Lösung gesucht, um ein Stapelverarbeitungsfenster zu schließen, wenn der Befehl EXIT das Fenster aus einem unbekannten Grund geöffnet lässt. Endlich bin ich auf eine Lösung gestoßen.

Entfernen Sie EXIT vom Ende der Batch-Datei und verwenden Sie:

Taskkill /IM conhost.exe /F
0
Bryan

Ich habe eine Net Use-Batchdatei auf einem 32-Bit-Computer mit Windows 7 erstellt, und der Befehl der Batchdatei wird nach der Ausführung nicht beendet. Ich führe dieselbe Batchdatei auf einem anderen Windows 7 64-Bit-Computer aus, und der Befehl der Batchdatei wird normal beendet.

Ich habe Bryans Vorschlag ausprobiert und er funktioniert auf diesem 32-Bit-Computer mit Windows 7 nicht, da es keinen conhost.exe-Prozess gab. Ich habe ihn folgendermaßen geändert :

Taskkill /IM cmd.exe /F

Die Batchdatei "Net Use" wird nicht immer normal beendet und zeigt die zufällige Bestätigung "Batchjob beenden (J/N)" .

Entsprechend diesem Thread habe ich die Batch-Datei wie folgt geändert:

@echo off

if "%~1"=="-FIXED_CTRL_C" (
   REM Remove the -FIXED_CTRL_C parameter
   SHIFT
) ELSE (
   REM Run the batch with <NUL and -FIXED_CTRL_C
   CALL <NUL %0 -FIXED_CTRL_C %*
   GOTO :EOF
)

Net Use \\Server\folder

Taskkill /IM cmd.exe /F

Die Batchdatei "Net Use" wird schließlich normal beendet.

0
w10

So habe ich es gemacht:

  1. Erstellen Sie eine Batchdatei mit folgendem Inhalt:

    Java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. Fügen Sie in Ihrem Exit-Eingabestream Folgendes hinzu:

    System.exit(1);
    
0
mishael

Windows 2003 verfügt standardmäßig über keine "Benutzerkonten" in der Systemsteuerung. Ich habe einen kurzen Stapel geschrieben, um Benutzerkonten zu eröffnen:

@echo off  
rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll  
exit

Es funktionierte einwandfrei, die Benutzerkonten wurden geöffnet, aber das CMD-Fenster blieb ebenfalls geöffnet. Nach einigen Recherchen hier habe ich an den Anfang von Zeile 2 Folgendes angefügt: START "":

@echo off  
Start "" rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll o
exit

Jetzt wird das Fenster Benutzerkonten geöffnet, bleibt geöffnet und das CMD-Fenster wird geschlossen. Kinderleicht.

0
user510236