Perché cmd non verrà chiuso dopo l'esecuzione del file batch?


25

Perché cmd non verrà chiuso dopo l'esecuzione del file batch?

Ho provato:

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

e

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

Risposte:


31

Se l'app Java non termina (ad es. Si sta utilizzando il file batch per avviare l'app Java), utilizzare il startcomando per avviarla: -

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

Ciò avvierà l'app java e continuerà l'esecuzione del file batch senza attendere il completamento dell'app java.


20

Spiegazione:

Ecco come funziona; un file batch viene elaborato una riga alla volta. Ogni comando viene eseguito a turno e il processore batch attende che un comando termini prima di iniziare il successivo. Il problema che stai riscontrando è perché l'applicazione Java che stai lanciando (Jilko.jar) è un programma con finestre che continua a essere eseguito anche dopo la linea che lo avvia. Se fosse uno strumento che esegue qualche azione e quindi termina, il file batch continuerà al comando successivo (o uscirà se non ce ne sono più). Poiché il programma è ancora in esecuzione, il processore batch attende fino alla chiusura della finestra prima di procedere. Puoi vederlo in azione uscendo dal programma Java: la finestra della console con il file batch si chiude.


Soluzione:

Quello che devi fare per risolverlo è istruire il processore batch ad avviare il programma e continuare senza attendere come tale:

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

Come menzionato da Terrance , ""è il titolo da utilizzare per la finestra della console. Tuttavia è facoltativo solo se il comando non è tra virgolette; altrimenti è richiesto . Puoi inserire qualcosa se lo desideri o lasciarlo vuoto, ma se il comando è tra virgolette, deve essere presente, altrimenti l'interprete dei comandi tratterà il comando tra virgolette come il titolo e aprirà una console che rimane lì in attesa di qualcosa da fare.

È possibile utilizzare invece il comando seguente, ma le virgolette sono semplicemente più semplici e sicure poiché i nomi brevi non sono garantiti uguali su tutti i sistemi.

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

Il startcomando è un comando integrato che genera un processo (sostanzialmente come l'esecuzione di un programma dal menu Start). Quindi ciò che accade in questo contesto è che il processore batch esegue il startcomando che a sua volta esegue il programma specificato e termina (esso stesso, non il programma generato). Pertanto, il processore batch continua come previsto. Ha anche alcune opzioni che possono essere utili come l'esecuzione del programma minimized ( /min) o maximized ( /max), eseguendolo in bassa priorità ( /low) e così via. Vedi start /?per i dettagli.


Possiamo considerare di iniziare come nohup en.wikipedia.org/wiki/Nohup
Muhammad Hewedy

No. (A meno che non si desideri confrontare con nohup e &).
Hennes,

7

Ho scoperto che alcuni dei programmi che lancio lasciano in esecuzione i processi e la finestra della console non si chiuderà finché non si chiudono se li eseguo semplicemente avviando l'eseguibile.

Il programma START lo risolve, ma il vecchio problema con START è ancora in giro. Non puoi semplicemente usare:

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

Il primo parametro di START è ancora il nome della finestra. Se lo ometti, basta aprire una finestra della console CMD con la finestra denominata qualunque cosa tu abbia tentato di avviare. Nell'istanza sopra, ora avrei una finestra della console con il titolo di " c: \ my dir \ myfile.exe ". Non quello che volevo!

Per omettere il nome della finestra, basta usare una coppia di virgolette doppie per definire una stringa vuota, come:

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

Infine, termina il file batch con un comando EXIT per assicurarti che venga chiuso.

Questo metodo sembra funzionare in modo coerente in Windows 7 e 8.

Per la risoluzione dei problemi, trovo che l'aggiunta di un ECHO di ciò che sto per fare, quindi un TIMEOUT di ciò che ho appena fatto, aiuta molto. Per esempio:

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

Poiché il timeout ti dà un conto alla rovescia, non è necessario che ECHO stia per ritardare.


5

Inoltre, utilizza EXIT in qualsiasi momento, in Windows 7, poiché il semplice arrivo alla fine del file batch non lo termina necessariamente, come nelle versioni precedenti di Windows. Windows 7 potrebbe essere più sensibile a questo rispetto alle versioni precedenti di NT (ad esempio Windows 2000 Professional). Questo è stato menzionato in alcune, ma non in tutte le risposte precedenti.

Dettagli dell'esperienza personale a supporto della risposta:

Dopo aver trasferito un'installazione di StarOffice5.2 da Windows 2000 a Windows 7, al termine della suite stavo ricevendo errori di spazio di memoria. Questo non è stato visto in Windows 2000.

Anni fa, avevo scritto file batch per eseguire automaticamente il backup e il ripristino di soffice.ini, per consentire una riparazione in caso di danneggiamento (spesso abbastanza per essere un problema: la suite non riesce a caricarsi). Tuttavia, il backup automatico (attivato da un collegamento al file batch, inserito in Office52 \ user \ config \ startup) avviene solo dopo un ritardo di 5 secondi. Ho notato ogni volta che sono uscito dalla suite appena prima dell'esecuzione del file batch, la chiusura della suite è andata senza errori. Questo mi ha indicato un problema nei file batch.

Dopo che il comando 'EXIT' è stato inserito come ultima riga nei file batch, la suite per ufficio ha iniziato a terminare senza messaggi di errore dello spazio di memoria, in qualsiasi momento, indipendentemente dal fatto che i file batch fossero stati eseguiti.


2

Una volta terminata l'app, dovrebbe uscire. Sei sicuro che l'app Java stia uscendo correttamente?


2

Stavo solo affrontando lo stesso problema e alla fine si è risolto da solo dopo aver apportato quelle che sembravano modifiche casuali al file batch- Non capisco perché, ma lo posterò qui nel caso in cui aiuti qualcun altro in seguito.

Uso l' utility SysInternals Pskill e l' utilità sleep poiché XP Home non include molto in termini di funzionalità della riga di comando.


Questo è il file batch che in realtà chiude dopo che è stato eseguito:

@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

Se avessi cambiato le ultime righe in questo modo, la finestra cmd rimarrebbe aperta fino a quando non avessi fatto clic sulla "X" nell'angolo:

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

Anche quando provassi a invocare pskill per uccidersi, il processo cmd.exe scompariva dal Task Manager e pskill segnalava dall'interno che è cmd.exe che il processo cmd.exe era stato interrotto, ma la cmd.exefinestra restava comunque attiva Ho fatto clic sulla "X" nell'angolo:

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

Dopo aver aggiunto && exittutte le righe, ho notato che alcune di esse rispondevano e interrompevano l'elaborazione in batch, mentre altre no.

Quindi ho appena messo uno di quelli sensibili alla fine invece di come l'avevo originariamente.

Come ho detto, non so perché, ma sono contento che sia finita.


1
Questo è così inutile .
surfasb,

L'uscita di && funziona per me
jekcom

1

provare:

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


0

Ecco come l'ho fatto:

  1. Creare un file batch con i seguenti contenuti:

    java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. Nel flusso di input di uscita, aggiungi:

    System.exit(1);
    

0

Windows 2003 non ha "Account utente" nel Pannello di controllo per impostazione predefinita. Ho scritto un breve batch per aprire Account utente:

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

Funzionava bene, gli Account utente si aprivano, ma anche la finestra CMD rimaneva aperta. Dopo alcune ricerche qui, ho aggiunto: INIZIA "" all'inizio della riga 2 in questo modo:

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

Ora la finestra Account utente si apre, rimane aperta e la finestra CMD si chiude. Vai tranquillo.


0

Ho cercato e cercato una soluzione per chiudere una finestra del file batch quando il comando EXIT lascia la finestra aperta per un motivo sconosciuto. Alla fine mi sono imbattuto in una soluzione.

Rimuovere EXIT dalla fine del file batch e utilizzare:

Taskkill /IM conhost.exe /F

0

Ho creato un file batch di net use su un computer Windows 7 a 32 bit e il cmd del file batch non verrà chiuso dopo l'esecuzione. Eseguo lo stesso file batch su un'altra macchina Windows 7 a 64 bit e il cmd del file batch esce normalmente.

Ho provato il suggerimento di Bryan e non funziona su quella macchina Windows 7 a 32 bit perché non c'era un processo conhost.exe, quindi l'ho modificato come segue:

Taskkill /IM cmd.exe /F

Il file batch net use non si chiude sempre normalmente e mostra la conferma "Termina processo batch (S / N)" in modo casuale .

Secondo questo thread ho modificato il file batch come segue:

@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

Il file batch net use alla fine si chiude normalmente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.