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

25

Warum wird cmd nach der 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
Joe
quelle

Antworten:

31

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

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 dass darauf gewartet werden muss, dass die Java-App beendet wird.

Misterjaytee
quelle
20

Erläuterung:

Hier ist, wie es funktioniert; Eine Batch-Datei wird zeilenweise verarbeitet. Jeder Befehl wird der Reihe nach 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 Batch-Prozessor 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 Terrance erwähnt hat , ""ist dies der Titel, der für das Konsolenfenster verwendet werden soll. Es 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. Wenn der Befehl jedoch in Anführungszeichen steht, muss er vorhanden sein. Andernfalls behandelt der Befehlsinterpreter den in Anführungszeichen angegebenen Befehl als Titel und öffnet eine Konsole, die nur darauf 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 startBefehl 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 startBefehl 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, beispielsweise 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 weitere Einzelheiten.

Synetech
quelle
Können wir uns nohup
vorstellen,
Nein (es sei denn, Sie möchten mit nohup und & vergleichen).
Hennes
7

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: \ Mein Verzeichnis \ MeineDatei.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. Beispielsweise:

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

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

AzDayton
quelle
5

Auch - Einsatz EXIT jederzeit, unter Windows 7, als nur bis zum Ende der Batch - Datei bekommt nicht unbedingt es beenden - wie in früheren Windows - Versionen. Windows 7 reagiert möglicherweise empfindlicher als frühere NT-Versionen (z. B. Windows 2000 Professional). Dies wurde in einigen, aber nicht in allen 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 eine Verknüpfung mit der 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 Batch-Datei verließ. Dies wies mich auf ein Problem in den Batchdateien 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.

RonCam
quelle
2

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

Azz
quelle
2

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 benutze das SysInternals Pskill- Dienstprogramm und das Sleep- Dienstprogramm, da XP Home nicht viel in Bezug auf die Befehlszeilenfunktionalität enthält .


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, und das cmd.exeFenster blieb dennoch bis zum nächsten Schritt aktiv Ich habe auf das 'X' in der Ecke geklickt:

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 && exitjede Zeile ergänzt 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.

NginUS
quelle
1
Das ist so unnötig .
Surfasb
&& exit funktioniert für mich
jekcom
1

Versuchen:

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

Robert S. Ciaccio
quelle
0

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);
    
Mischael
quelle
0

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.

user510236
quelle
0

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
Bryan
quelle
0

Ich habe auf einem 32-Bit-Computer mit Windows 7 eine Batch-Datei für die Nettonutzung erstellt, und der Befehl der Batch-Datei 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 für die Nettonutzung wird nicht immer normal beendet und es wird nach dem Zufallsprinzip die Bestätigung "Batchjob beenden (J / N)" angezeigt .

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 net use Batch-Datei wird schließlich normal beendet.

w10
quelle