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
Si l'application Java ne se termine pas (par exemple, vous utilisez le fichier de commandes pour lancer l'application Java), utilisez la commande start
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.
Explication:
Voici comment cela fonctionne. un fichier de commandes est traité ligne par ligne. Chaque commande est exécutée à son tour et le traitement par lot attend la fin d'une commande avant de lancer 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être qui continue de s'exécuter même après la ligne qui l'a lancé. 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 traitement par lot attend que la fenêtre soit fermée avant de poursuivre. Vous pouvez le voir en action en quittant le programme Java: la fenêtre de la console contenant le fichier de commandes se ferme.
Solution:
Ce que vous devez faire pour résoudre ce problème est de demander au processeur de traitement par lots de lancer le programme et de continuer sans attendre:
start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
Comme Terrance a mentionné , le ""
est le titre à utiliser pour la fenêtre de la console. Cependant, il n’est facultatif que si la commande n’est pas entre guillemets; sinon, est requis . Vous pouvez mettre quelque chose dedans si vous voulez ou le laisser vide, mais si la commande est entre guillemets, elle doit être présente, sinon l'interpréteur de commande traitera la commande citée comme le titre et ouvrira une console qui attend simplement quelque chose à faire.
Vous pouvez utiliser quelque chose avec la commande suivante à la place, mais les guillemets sont simplement plus faciles et plus sûrs car il n’est pas garanti que les noms abrégés soient les mêmes sur tous les systèmes.
start C:\Progra~2\Java\jre6\bin\javaw.exe -Xmx1024M -Xms1024M -jar Jilko.jar
La commande start
est une commande intégrée qui génère un processus (comme si vous exécutiez un programme à partir du menu Démarrer). Ainsi, dans ce contexte, le traitement par lots exécute la commande start
qui, à son tour, exécute le programme spécifié et se termine (elle-même, pas le programme généré). En tant que tel, le traitement par lots continue comme prévu. Certaines options peuvent également être utiles, telles que l’exécution du programme minimisé (/min
) ou agrandi (/max
), son exécution en priorité basse (/low
), etc. Voir start /?
pour plus de détails.
J'ai constaté que certains des programmes que je lance laissaient les processus en cours d'exécution et que la fenêtre de la console ne se fermerait pas tant qu'ils ne seraient pas fermés si je les exécutais simplement en lançant l'exécutable.
Le programme START résout ce problème, mais l’ancien problème avec START existe toujours. Vous ne pouvez pas simplement utiliser:
START "c:\my dir\myfile.exe"
Le premier paramètre de START reste le nom de la fenêtre. Si vous l'omettez, vous ouvrez simplement une boîte de la console CMD avec la fenêtre nommée tout ce que vous avez essayé de lancer. Dans l'exemple ci-dessus, je disposerais maintenant d'une fenêtre de console avec le titre de la fenêtre " c:\mon répertoire\monfichier.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 s’assurer qu’il se ferme.
Cette méthode semble fonctionner de manière cohérente dans Windows 7 et 8.
Pour le dépannage, je trouve qu’ajouter un ECHO de ce que je vais faire, puis 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
Puisque le délai d'attente vous donne un compte à rebours, vous n'avez pas besoin de retarder ECHO.
De plus, utilisez EXIT à tout moment, sous Windows 7, car le fait d’atteindre la fin du fichier de commandes ne le termine pas nécessairement - comme dans les versions antérieures de Windows. Windows 7 est peut-être plus sensible à cela que les versions antérieures de NT (par exemple, Windows 2000 Professionnel). Cela a été mentionné dans certaines réponses mais pas dans toutes les réponses précédentes.
Détails de l'expérience personnelle à l'appui de la réponse:
Après avoir transféré une installation StarOffice5.2 de Windows 2000 à Windows 7, je rencontrais 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 de commandes pour sauvegarder et restaurer automatiquement soffice.ini, pour permettre une réparation lorsqu'elle est corrompue (assez souvent pour être un problème - le chargement de la suite ne parvient pas). La sauvegarde automatique (déclenchée par un lien vers le fichier de commandes placé dans Office52\user\config\startup) ne se produit toutefois 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 de commandes, la fermeture de la suite se passait sans erreur. Cela m'a signalé un problème dans les fichiers de commandes.
Après que la commande 'EXIT' ait été placée comme dernière ligne des fichiers de commandes, la suite bureautique a commencé à se terminer sans message d'erreur d'espace mémoire, que les fichiers de commandes aient été exécutés ou non.
Une fois que l'application est terminée, il devrait être quitter. Êtes-vous sûr que l'application Java se ferme correctement?
Je ne faisais que traiter du même problème, et il s'est finalement résolu après avoir apporté des modifications aléatoires au fichier de commandes. Je ne comprends pas pourquoi, mais je vais les publier ici au cas où cela aiderait quelqu'un d'autre plus tard.
Je me sers de l'utilitaire SysInternals Pskill et de l'utilitaire sleep depuis XP Home n'inclut pas grand-chose en termes de fonctionnalité de ligne de commande.
Ceci est le fichier batch qui se ferme après cela:
@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 les dernières lignes étaient modifiées de cette façon, la fenêtre de commande 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'ai essayé d'appeler pskill pour qu'il se tue, le processus cmd.exe disparaissait du gestionnaire de tâches et pskill signalait depuis l'intérieur de celui-ci que le processus cmd.exe avait été tué, mais la fenêtre cmd.exe
restait active. 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
sleep 1
C:\Progra~1\PsTools\pskill.exe cmd.exe
Après avoir ajouté && exit
à chaque ligne, j’ai remarqué que certaines d’entre elles y répondaient et interrompaient le traitement par lots, alors que d’autres ne le feraient pas.
Donc, je viens de mettre l'un des plus sensibles à 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.
essayer:
cmd /c "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
Je cherchais et cherchais une solution pour fermer une fenêtre de fichier de traitement par lots lorsque la commande EXIT la laisse ouverte pour une raison inconnue. Je suis finalement tombé sur une solution.
Supprimez EXIT de la fin du fichier de commandes et utilisez:
Taskkill /IM conhost.exe /F
J'ai créé un fichier de traitement par lot Net Use sur un ordinateur Windows 7 32 bits et la cmd du fichier de traitement ne se ferme pas après son exécution. J'exécute le même fichier de commandes sur un autre ordinateur 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 aucun processus conhost.exe, je l'ai donc modifié comme suit :
Taskkill /IM cmd.exe /F
Le fichier de traitement par lot Net Use ne se ferme pas toujours normalement et affiche la confirmation "Terminer le travail par lot (O/N)" .
Selon ce fil , j'ai modifié le fichier de commandes 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 et éventuellement se ferme normalement.
Voici comment je l'ai fait:
Créez un fichier de commandes avec le contenu suivant:
Java -Xms512M -Xmx512M -jar yourFileName.jar -o true
EXIT
Dans votre flux d'entrée de sortie, ajoutez:
System.exit(1);
Windows 2003 n'a pas de "comptes d'utilisateurs" dans le Panneau de configuration par défaut. J'ai écrit un court lot pour ouvrir des comptes d'utilisateurs:
@echo off
rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll
exit
Cela a fonctionné correctement, les comptes d’utilisateur 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 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.