Pourquoi cmd ne se ferme-t-il pas après l'exécution du fichier de commandes?


25

Pourquoi cmd ne se ferme-t-il pas après l'exécution du fichier de commandes?

J'ai essayé:

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

et

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

Réponses:


31

Si l'application Java ne se termine pas (par exemple, vous utilisez le fichier batch pour lancer l'application Java), utilisez la startcommande pour la lancer: -

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

Cela lancera l'application java et poursuivra l'exécution du fichier de commandes sans attendre la fin de l'application java.


20

Explication:

Voici comment cela fonctionne; un fichier de commandes est traité une ligne à la fois. Chaque commande est exécutée à son tour et le processeur par lots attend la fin d'une commande avant de démarrer la suivante. Le problème que vous rencontrez est dû au fait que l'application Java que vous lancez (Jilko.jar) est un programme fenêtré qui continue de s'exécuter même après la ligne qui le lance. S'il s'agissait d'un outil qui effectue une action puis se termine, le fichier de commandes continue à la commande suivante (ou se ferme s'il n'y en a plus). Étant donné que le programme est toujours en cours d'exécution, le processeur de traitement par lots attend que la fenêtre soit fermée avant de continuer. Vous pouvez le voir en action en quittant le programme Java: la fenêtre de la console avec le fichier batch se ferme alors.


Solution:

Ce que vous devez faire pour y remédier, est de demander au processeur de traitement par lots de lancer le programme et de continuer sans attendre en tant que tel:

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

Comme Terrance l'a mentionné , ""c'est le titre à utiliser pour la fenêtre de la console. Cependant, elle n'est facultative que si la commande n'est pas entre guillemets; sinon est requis . Vous pouvez y mettre quelque chose si vous le souhaitez ou le laisser vide, mais si la commande est entre guillemets, elle doit être présente, sinon l'interpréteur de commandes traitera la commande citée comme le titre et ouvrira une console qui se trouve juste là en attendant quelque chose à faire.

Vous pouvez utiliser quelque chose à la place de la commande suivante, mais les guillemets sont simplement plus faciles et plus sûrs car les noms abrégés ne sont pas garantis comme étant identiques sur tous les systèmes.

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

La startcommande est une commande intégrée qui génère un processus (essentiellement comme exécuter un programme à partir du menu Démarrer). Donc, ce qui se passe dans ce contexte, c'est que le processeur par lots exécute la startcommande qui à son tour exécute le programme spécifié et se termine (lui-même, pas le programme généré). En tant que tel, le processeur par lots continue comme prévu. Il dispose également de certaines options qui peuvent être utiles, telles que l'exécution du programme minimized ( /min) ou maximized ( /max), son exécution en faible priorité ( /low), etc. Voir start /?pour plus de détails.


Pouvons-nous envisager de commencer comme nohup en.wikipedia.org/wiki/Nohup
Muhammad Hewedy

Non. (Sauf si vous voulez comparer avec nohup et &).
Hennes

7

J'ai constaté que certains des programmes que je lance laissent des processus en cours d'exécution, et la fenêtre de la console ne se fermera pas jusqu'à ce qu'ils se terminent si je les exécute simplement en lançant l'exécutable.

Le programme START corrige cela, mais l'ancien problème avec START est toujours là. Vous ne pouvez pas simplement utiliser:

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

Le premier paramètre de START est toujours le nom de la fenêtre. Si vous l'omettez, vous ouvrez simplement une boîte de console CMD avec la fenêtre nommée tout ce que vous avez essayé de lancer. Dans l'exemple ci-dessus, j'aurais maintenant une fenêtre de console avec le titre de la fenêtre " c: \ my dir \ myfile.exe ". Pas ce que je voulais!

Pour omettre le nom de la fenêtre, utilisez simplement une paire de guillemets doubles pour définir une chaîne vide, telle que:

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

Enfin, terminez votre fichier de commandes avec une commande EXIT pour vous assurer qu'il se ferme.

Cette méthode semble fonctionner de manière cohérente sous Windows 7 et 8.

Pour le dépannage, je trouve que l'ajout d'un ECHO de ce que je vais faire, puis d'un TIMEOUT de ce que je viens de faire, aide beaucoup. Par exemple:

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

Étant donné que le délai d'attente vous donne un compte à rebours, vous n'avez pas besoin d'ECHO que vous êtes sur le point de retarder.


5

Aussi - utilisez EXIT à tout moment, sous Windows 7, car le simple fait d'arriver à la fin du fichier de commandes ne le termine pas nécessairement - comme dans les versions antérieures de Windows. Windows 7 peut être plus sensible à cela que les versions NT antérieures (par exemple Windows 2000 Professionnel). Cela a été mentionné dans certaines, mais pas dans toutes les réponses précédentes.

Détails de l'expérience personnelle pour soutenir la réponse:

Après avoir transféré une installation StarOffice5.2 de Windows 2000 vers Windows 7, je recevais des erreurs d'espace mémoire lors de la fermeture de la suite. Cela n'a pas été vu dans Windows 2000.

Il y a des années, j'avais écrit des fichiers batch pour sauvegarder et restaurer automatiquement soffice.ini, pour permettre une réparation quand il est corrompu (souvent assez pour être un problème - la suite ne se charge pas). La sauvegarde automatique (déclenchée par un lien vers le fichier de commandes, placé dans Office52 \ user \ config \ startup) ne se produit cependant qu'après un délai de 5 secondes. J'ai remarqué que chaque fois que je quittais la suite juste avant l'exécution du fichier batch, la fermeture de la suite se faisait sans erreur. Cela m'a signalé un problème dans les fichiers de commandes.

Après que la commande 'EXIT' a été placée comme dernière ligne sur les fichiers de commandes, la suite bureautique a commencé à se terminer sans messages d'erreur d'espace mémoire, à tout moment, que les fichiers de commandes aient été exécutés ou non.


2

Une fois l'application terminée, elle devrait se fermer. Êtes-vous sûr que l'application Java se ferme correctement?


2

Je faisais face au même problème, et il s'est finalement résolu après avoir apporté ce qui semblait être des modifications aléatoires au fichier de commandes - Je ne comprends pas pourquoi mais je le posterai ici au cas où cela aiderait quelqu'un d'autre plus tard.

J'utilise l' utilitaire SysInternals Pskill et l' utilitaire de veille car XP Home n'inclut pas grand-chose en termes de fonctionnalité de ligne de commande.


C'est le fichier batch qui se ferme réellement une fois terminé:

@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 j'avais les dernières lignes modifiées comme ceci, la fenêtre cmd resterait ouverte jusqu'à ce que je clique sur le «X» dans le coin:

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

Même lorsque j'essayais d'invoquer pskill pour se tuer, le processus cmd.exe disparaîtrait du Gestionnaire des tâches, et pskill signalait de l'intérieur c'est cmd.exe que le processus cmd.exe avait été tué, mais la cmd.exefenêtre restait toujours ouverte jusqu'à J'ai cliqué sur le «X» dans le coin:

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

Après avoir ajouté && exità chaque ligne, j'ai remarqué que certains d'entre eux y répondaient et interrompraient le traitement par lots, tandis que d'autres ne le feraient pas.

Je viens donc de mettre l'un des réactifs à la fin au lieu de la façon dont je l'avais à l'origine.

Comme je l'ai dit, je ne sais pas pourquoi, mais je suis content que ce soit fini.


1
C'est tellement inutile .
surfasb

&& exit fonctionne pour moi
jekcom

1

essayer:

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


0

Voici comment je l'ai fait:

  1. Créez un fichier de commandes avec le contenu suivant:

    java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. Dans votre flux d'entrée de sortie, ajoutez:

    System.exit(1);
    

0

Windows 2003 n'a pas de "comptes d'utilisateurs" dans le panneau de configuration par défaut. J'ai écrit un petit lot pour ouvrir les comptes d'utilisateurs:

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

Cela a bien fonctionné, les comptes d'utilisateurs ont été ouverts, mais la fenêtre CMD est également restée ouverte. Après quelques recherches ici, j'ai ajouté: START "" au début de la ligne 2 comme ceci:

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

Maintenant, la fenêtre Comptes d'utilisateurs s'ouvre, reste ouverte et la fenêtre CMD se ferme. Peasy facile.


0

Je cherchais et cherchais une solution pour fermer une fenêtre de fichier de commandes lorsque la commande EXIT laisse la fenêtre ouverte pour une raison inconnue. J'ai finalement trouvé une solution.

Supprimez EXIT à la fin du fichier de commandes et utilisez:

Taskkill /IM conhost.exe /F

0

J'ai créé un fichier batch d'utilisation nette sur une machine Windows 7 32 bits et la cmd du fichier batch ne se fermera pas après l'exécution. J'exécute le même fichier de commandes sur une autre machine Windows 7 64 bits et la cmd du fichier de commandes se ferme normalement.

J'ai essayé la suggestion de Bryan et cela ne fonctionne pas sur cette machine Windows 7 32 bits car il n'y avait pas de processus conhost.exe, je l'ai donc modifié comme suit:

Taskkill /IM cmd.exe /F

Le fichier de lot d'utilisation nette ne se ferme pas toujours normalement et il affiche une confirmation "Terminer le travail par lots (O / N)" de manière aléatoire .

Selon ce fil, j'ai modifié le fichier batch comme suit:

@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

Le fichier de commandes net use finit par se terminer normalement.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.