Pourquoi le cmd ne quittera-t-il pas après l'exécution du fichier batch?

Pourquoi le cmd ne quittera-t-il pas après l'exécution du fichier batch?

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 

Si l'application Java ne se termine pas (par exemple, vous utilisez le fichier de commandes pour lancer l'application Java), utilisez la commande de start pour lancer:

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

Cela va lancer l'application java et continuer à exécuter le fichier batch sans attendre l'achèvement de l'application java.

Explication:

Voici comment cela fonctionne; Un fichier batch est traité une ligne à la fois. Chaque commande est exécutée à tour de rôle et le processeur de lot attend qu'une commande se termine avant de commencer la prochaine. Le problème que vous rencontrez est que l'application Java que vous lancez (Jilko.jar) est un programme à fenêtres qui continue à fonctionner 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 batch continuerait à la prochaine commande (ou sortez s'il n'y en a plus). Étant donné que le programme fonctionne toujours, le processeur de lot attend jusqu'à ce que la fenêtre soit fermée avant de passer. Vous pouvez voir cela en action en sortant du programme Java: la fenêtre de la console avec le fichier batch se ferme.

Solution:

Ce que vous devez faire pour le réparer, c'est d'instruire le processeur de lot pour lancer le programme et continuer sans attendre en tant que tel:

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

Comme l'a mentionné Terrance , le "" est le titre à utiliser pour la fenêtre de la console. Cependant, il est seulement facultatif si la commande n'est pas entre guillemets; Sinon il est nécessaire . Vous pouvez mettre quelque chose là-dedans 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 titre et ouvrira une console qui vient juste d'y être attendue quelque chose à faire.

Vous pouvez utiliser quelque chose de la commande suivante à la place, mais les guillemets sont simplement plus faciles et plus sûrs car les noms courts ne sont pas garantis pour être identiques sur tous les systèmes.

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

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

J'ai constaté que certains des programmes que je lancer quittent les processus en cours d'exécution et que la fenêtre de la console ne se ferme pas avant qu'ils ne se terminent si je les exécute simplement en lançant l'exécutable.

Le programme START le corrige, 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'omet, il vous suffit d'ouvrir une boîte de console CMD avec la fenêtre appelée quoi que vous avez essayé de lancer. Dans l'instance 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 supprimer le nom de la fenêtre, utilisez une paire de guillemets pour définir une chaîne vide, par exemple:

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

Enfin, mettez fin à votre fichier batch avec une commande EXIT pour vous assurer qu'il se ferme.

Cette méthode semble fonctionner régulièrement dans Windows 7 et 8.

Pour le dépannage, je trouve que l'ajout d'un ECHO de ce que je vais faire, alors un TEMPS 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.

Aussi – utilisez EXIT en tout temps, sous Windows 7, car l'arrivée juste à la fin du fichier batch ne le résilie pas nécessairement – comme dans les versions antérieures de Windows. Windows 7 peut être plus sensible à cela que les versions antérieures de NT (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 répondre à la réponse:

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

Il y a quelques années, j'avais écrit des fichiers batch pour sauvegarder automatiquement et restaurer soffice.ini, pour permettre une réparation quand il est corrompu (assez souvent pour être un problème – la suite ne parvient pas à charger). La sauvegarde automatique (déclenchée par un lien vers le fichier batch, placé dans Office52 \ user \ config \ startup) survient uniquement après un délai de 5 secondes. J'ai remarqué que chaque fois que j'avais quitté la suite juste avant la mise en service du lot, la fin de la suite s'est déroulée sans erreur. Cela m'a signalé un problème dans les fichiers par lots.

Une fois 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 dans l'espace mémoire, en tout temps, que les fichiers batch soient ou non exécutés.

Une fois l'application terminée, la sortie devrait être terminée. Êtes-vous sûr que l'application Java sort correctement?

J'étais en train de résoudre le même problème, et il s'est finalement résolu après avoir fait des changements aléatoires au fichier batch. Je ne comprends pas pourquoi, mais je l'afficherai 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 beaucoup en termes de fonctionnalités de ligne de commande.


C'est le fichier batch qui se ferme immédiatement après sa fin:

 @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 changées comme ça, la fenêtre cmd resterait ouverte jusqu'à ce que j'aie cliqué 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'ai essayé d'invoquer pskill pour me tuer, le processus cmd.exe disparaîtrait de Task Manager, et pskill rapporterait de l'intérieur, c'est cmd.exe que le processus cmd.exe avait été tué, mais la fenêtre cmd.exe serait encore Reste debout jusqu'à ce que je cliquene 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, alors que d'autres ne le feraient pas.

Donc, je viens de mettre l'un des répondeurs à la fin au lieu de l'avoir à l'origine.

Comme je l'ai dit, je ne sais pas pourquoi, mais je suis content que cela soit terminé.

essayer:

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

Voici comment je l'ai fait:

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

     java -Xms512M -Xmx512M -jar yourFileName.jar -o true EXIT 
  2. Dans votre flux de sortie, ajoutez:

     System.exit(1); 

Windows 2003 n'a pas de «comptes utilisateur» dans le Panneau de configuration par défaut. J'ai écrit un petit lot pour ouvrir les comptes utilisateur:

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

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

 @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.

J'ai cherché et cherché une solution pour fermer une fenêtre de fichier par lot lorsque la commande EXIT laisse la fenêtre ouverte pour une raison inconnue. Je suis finalement tombé sur une solution.

Supprimez EXIT à partir de la fin du fichier batch et utilisez:

 Taskkill /IM conhost.exe /F 

J'ai créé un fichier de chargement net d'utilisation sur une machine Windows 7 à 32 bits et la cmd du fichier batch ne sortira pas après l'exécution. Je lance le même fichier batch sur une autre machine Windows 7 à 64 bits et la cmd du fichier batch sort 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, donc je l'ai modifié comme suit:

 Taskkill /IM cmd.exe /F 

Le fichier de chargement net utilise pas toujours la sortie normalement et il montre "Terminer batch job (Y / N)" de confirmation au hasard .

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 net utilise le fichier batch finit par sortir normalement.