¿Por qué no se cerrará cmd después de la ejecución del archivo por lotes?

25

¿Por qué no se cerrará cmd después de la ejecución del archivo por lotes?

Yo he tratado:

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

y

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

Respuestas:

31

Si la aplicación Java no finaliza (por ejemplo, está utilizando el archivo por lotes para iniciar la aplicación Java), utilice el startcomando para iniciarla:

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

Esto iniciará la aplicación Java y continuará ejecutando el archivo por lotes sin esperar a que la aplicación Java termine.

misterjaytee
fuente
20

Explicación:

Así es como funciona; un archivo por lotes se procesa una línea a la vez. Cada comando se ejecuta a su vez y el procesador por lotes espera a que termine un comando antes de comenzar el siguiente. El problema que está experimentando es porque la aplicación Java que está iniciando (Jilko.jar) es un programa en ventana que continúa ejecutándose incluso después de la línea que lo inicia. Si se tratara de una herramienta que realiza alguna acción y luego finaliza, el archivo por lotes continuará con el siguiente comando (o se cerrará si no hay más). Debido a que el programa aún se está ejecutando, el procesador por lotes espera hasta que se cierre la ventana antes de continuar. Puede ver esto en acción al salir del programa Java: la ventana de la consola con el archivo por lotes se cierra.


Solución:

Lo que debe hacer para solucionarlo es indicar al procesador por lotes que inicie el programa y continúe sin esperar como tal:

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

Como mencionó Terrance , ""es el título para usar en la ventana de la consola. Sin embargo, solo es opcional si el comando no está entre comillas; de lo contrario se requiere . Puede poner algo allí si lo desea o dejarlo vacío, pero si el comando está entre comillas, debe estar presente, de lo contrario, el intérprete de comandos tratará el comando citado como el título y abrirá una consola que simplemente se queda allí esperando algo que hacer.

En su lugar, puede usar algo del siguiente comando, pero las comillas son más fáciles y seguras ya que no se garantiza que los nombres cortos sean los mismos en todos los sistemas.

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

El startcomando es un comando incorporado que genera un proceso (básicamente como ejecutar un programa desde el menú Inicio). Entonces, lo que sucede en este contexto es que el procesador por lotes ejecuta el startcomando que a su vez ejecuta el programa especificado y finaliza (en sí mismo, no el programa generado). Como tal, el procesador por lotes continúa como se esperaba. También tiene algunas opciones que pueden ser útiles, como ejecutar el programa minimized ( /min) o maximized ( /max), ejecutarlo en baja prioridad ( /low), etc. Ver start /?para más detalles.

Synetech
fuente
¿Podemos considerar comenzar como nohup en.wikipedia.org/wiki/Nohup
Muhammad Hewedy
No. (A menos que quiera comparar con nohup y &).
Hennes
7

Descubrí que algunos de los programas que ejecuto dejan procesos en ejecución, y la ventana de la consola no se cerrará hasta que finalicen si solo los ejecuto ejecutando el ejecutable.

El programa START soluciona eso, pero el viejo problema con START todavía está presente. No puedes simplemente usar:

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

El primer parámetro de START sigue siendo el nombre de la ventana. Si lo omite, simplemente abra una caja de consola CMD con la ventana llamada lo que haya intentado iniciar. En la instancia anterior, ahora tendría una ventana de consola con el título de la ventana " c: \ my dir \ myfile.exe ". ¡No es lo que quería!

Para omitir el nombre de la ventana, solo use un par de comillas dobles para definir una cadena vacía, como:

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

Finalmente, finalice su archivo por lotes con un comando EXIT para asegurarse de que se cierre.

Este método parece funcionar consistentemente en Windows 7 y 8.

Para la resolución de problemas, encuentro que agregar un ECHO de lo que estoy a punto de hacer, luego un tiempo de espera de lo que acabo de hacer, ayuda mucho. Por ejemplo:

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

Dado que el tiempo de espera le da una cuenta regresiva, no necesita ECHO que está a punto de retrasar.

AzDayton
fuente
5

Además, use EXIT en todo momento, en Windows 7, ya que solo llegar al final del archivo por lotes no necesariamente lo termina, como en las versiones anteriores de Windows. Windows 7 puede ser más sensible a esto que las versiones anteriores de NT (por ejemplo, Windows 2000 Professional). Esto se mencionó en algunas, pero no en todas las respuestas anteriores.

Detalles de la experiencia personal para apoyar la respuesta:

Después de transferir una instalación de StarOffice5.2 de Windows 2000 a Windows 7, recibí errores de espacio de memoria al finalizar el paquete. Esto no se vio en Windows 2000.

Hace años, había escrito archivos por lotes para hacer copias de seguridad y restaurar automáticamente soffice.ini, para permitir una reparación cuando se corrompe (a menudo lo suficiente como para ser un problema: la suite no se carga). Sin embargo, la copia de seguridad automática (activada por un enlace al archivo por lotes, ubicado en Office52 \ user \ config \ startup) solo ocurre aproximadamente después de un retraso de 5 segundos. Me di cuenta de que cada vez que salía de la suite justo antes de que se ejecutara el archivo por lotes, la finalización de la suite fue sin error. Esto me señaló un problema en los archivos por lotes.

Después de que el comando 'EXIT' se colocó como la última línea en los archivos por lotes, la suite ofimática comenzó a terminar sin mensajes de error de espacio de memoria, en todo momento, independientemente de si los archivos por lotes se habían ejecutado o no.

RonCam
fuente
2

Una vez que la aplicación está hecha, debería salir. ¿Estás seguro de que la aplicación Java está saliendo correctamente?

Azz
fuente
2

Estaba lidiando con el mismo problema, y ​​finalmente se resolvió por sí solo después de hacer lo que parecían cambios aleatorios en el archivo por lotes. No entiendo por qué, pero lo publicaré aquí en caso de que ayude a alguien más tarde.

Hago uso de la SysInternals PsKill la utilidad y el sueño utilidad desde XP Home no incluye mucho en términos de funcionalidad de línea de comandos.


Este es el archivo por lotes que realmente se cierra después de que se hace:

@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

Si hubiera cambiado las últimas líneas de esta manera, la ventana cmd permanecería abierta hasta que haga clic en la 'X' en la esquina:

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

Incluso cuando traté de invocar a pskill para suicidarse, el proceso cmd.exe desaparecería del Administrador de tareas, y pskill informaría desde el interior de cmd.exe que el proceso cmd.exe había sido eliminado, pero la cmd.exeventana permanecería activa hasta Hice clic en la 'X' en la esquina:

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

Después de agregar && exita cada línea, noté que algunas respondían e interrumpían el procesamiento por lotes, mientras que otras no.

Así que puse uno de los que respondieron al final en lugar de cómo lo tenía originalmente.

Como dije, no sé por qué, pero me alegro de que esto haya terminado.

NginUS
fuente
1
Esto es muy innecesario .
Surfasb
&& salir funciona para mí
jekcom
1

tratar:

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

Robert S Ciaccio
fuente
0

Así es como lo hice:

  1. Cree un archivo por lotes con los siguientes contenidos:

    java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. Dentro de su flujo de entrada de salida, agregue:

    System.exit(1);
    
mishael
fuente
0

Windows 2003 no tiene "Cuentas de usuario" en el Panel de control de forma predeterminada. Escribí un lote corto para abrir Cuentas de usuario:

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

Funcionó bien, las cuentas de usuario se abrieron, pero la ventana CMD también permaneció abierta. Después de investigar un poco aquí, agregué: START "" al comienzo de la línea 2, así:

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

Ahora se abre la ventana Cuentas de usuario, permanece abierta y se cierra la ventana CMD. Pan comido.

usuario510236
fuente
0

He estado buscando y buscando una solución para cerrar una ventana de archivo por lotes cuando el comando EXIT deja la ventana abierta por una razón desconocida. Finalmente me topé con una solución.

Elimine EXIT del final del archivo por lotes y use:

Taskkill /IM conhost.exe /F
Bryan
fuente
0

Creé un archivo por lotes de uso neto en una máquina con Windows 7 de 32 bits y el cmd del archivo por lotes no se cerrará después de la ejecución. Ejecuto el mismo archivo por lotes en otra máquina con Windows 7 de 64 bits y el cmd del archivo por lotes sale normalmente.

Intenté la sugerencia de Bryan y no funciona en esa máquina con Windows 7 de 32 bits porque no había un proceso conhost.exe, así que lo modifiqué de la siguiente manera:

Taskkill /IM cmd.exe /F

El archivo por lotes de uso neto no siempre sale normalmente y muestra la confirmación "Finalizar trabajo por lotes (S / N)" al azar .

De acuerdo con este hilo , modifiqué el archivo por lotes de la siguiente manera:

@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

El archivo por lotes de uso neto finalmente sale normalmente.

w10
fuente