2011-07-04 15:32:05 +0000 2011-07-04 15:32:05 +0000
56
56

Comment empêcher la fermeture de l'invite de commande après exécution ?

Mon problème est que dans Windows, il y a des fenêtres de ligne de commande qui se ferment immédiatement après exécution. Pour résoudre ce problème, je veux que le comportement par défaut soit que la fenêtre reste ouverte. Normalement, ce comportement peut être évité grâce à trois méthodes qui me viennent à l'esprit :

  1. Mettre une ligne pause après les programmes batch pour inviter l'utilisateur à appuyer sur une touche avant de quitter
  2. Exécuter ces fichiers batch ou d'autres outils de manipulation en ligne de commande (même le démarrage du service, le redémarrage, etc. avec net start xy ou quelque chose de similaire) dans cmd.exe(Start - Run - cmd.exe)
  3. Exécuter ces programmes avec cmd /k comme ceci : cmd /k myprogram.bat

Mais il y a d'autres cas dans lesquels l'utilisateur :

  1. Exécute le programme la première fois et ne sait pas que le programme donné s'exécutera à l'invite de commande (Windows Command Processor), par exemple lorsqu'il exécute un raccourci à partir du menu Démarrer (ou d'un autre endroit), OU
  2. Trouve un peu inconfortable d'exécuter cmd.exe tout le temps et n'a pas le temps/la possibilité de réécrire le code de ces commandes partout pour mettre une pause après elles ou éviter de sortir explicitement.

J'ai lu un article sur la modification du comportement par défaut de cmd.exe lors de son ouverture explicite, avec la création d'une entrée AutoRun et en manipulant son contenu à ces endroits :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

(Les éléments AutoRun sont _String values_…)

J'ai mis cmd /d /k comme valeur pour essayer, mais cela n'a pas du tout changé le comportement des éléments mentionnés ci-dessus… Cela a juste changé le comportement de la fenêtre de ligne de commande lors de son ouverture explicite (Start-Run-cmd.exe).

Alors comment ça marche ? Pouvez-vous me donner des idées pour résoudre ce problème ?

Réponses (11)

18
18
18
2011-07-04 17:45:20 +0000

Citation Microsoft :

Une console est fermée lorsque le dernier processus qui lui est rattaché se termine ou appelle FreeConsole.

En d'autres termes, la fenêtre de la console Win32 sera toujours fermée lorsque le dernier programme s'exécutant à l'intérieur de celle-ci se termine, et vous ne pouvez pas changer cela.


(Pour les programmes MS-DOS 16 bits, Windows offre une option “Fermer à la sortie” dans le dialogue des propriétés, mais ce n'est pas une exception au comportement ci-dessus : c'est le processus NTVDM qui maintient la fenêtre ouverte. De plus, cette option est à nouveau par programme).

8
8
8
2013-03-21 14:10:13 +0000

Il suffit d'ouvrir une invite de commande à l'emplacement de votre fichier batch, et de saisir manuellement le nom de votre fichier batch pour l'exécuter dans cette fenêtre.

1.naviguez jusqu'au dossier où réside votre exécutable 2.faites un clic droit et sélectionnez “Command Window from here” 3.tapez le nom de l'exécutable et appuyez sur enter 4.le processus devrait s'exécuter, mais la fenêtre devrait rester ouverte

4
4
4
2012-11-06 13:37:01 +0000

cmd.exe /k vous donnera du fil à retordre avec certains lots. Si le lot exit 1 (sans /B), votre console sera fermée. Une astuce consiste à utiliser :

cmd.exe /k cmd /c ...

Pour utiliser ceci par défaut pour tous les fichiers de lot, mettez HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default) et HKEY_CLASSES_ROOT\batfile\shell\open\command\(default) sur "%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*.

3
3
3
2014-04-26 16:55:23 +0000

Je viens de tomber sur une solution stupide après avoir lu la réponse de grawity.

Mon cas d'utilisation était la mise en place d'un environnement de console au travail où toutes les solutions les plus raisonnables sont bloquées. Tout ce dont j'ai besoin est de définir PATH et de configurer quelques alias de doskey et d'être dumpé dans le shell.

Ma solution (juste testée sur Win7) comme ajouter cmd comme dernière ligne du fichier batch. Cela lance une invite de commande imbriquée qui hérite de l'environnement de son parent. Ce shell enfant maintient le processus de traitement par lot ouvert jusqu'à ce que vous sortiez, moment auquel le lot n'a plus de processus enfant et sort également.

2
2
2
2015-12-11 17:02:56 +0000

Supposons que vous ayez deux fichiers batch que vous souhaitez lancer dans leur propre instance et garder ouverts si leur exécutable se termine. Appelons ces deux lots A.bat et B.bat.

Pour simplifier, vous pourriez avoir un fichier batch pour les lancer tous les deux, appelons cela launch_both.bat avec le contenu :

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

Cela pourrait ne pas fonctionner comme prévu si vous appelez exit dans un des deux fichiers batch. Cela devra être testé.

2
2
2
2013-03-21 20:02:36 +0000

Plutôt que d'utiliser la PAUSE (je préfère CHOIX ou TIMEOUT à l'utilisation de la PAUSE quand c'est nécessaire), vous pouvez utiliser la solution ici : 886848/how-to-make-windows-batch-file-pause-when-double-click ](https://stackoverflow.com/questions/886848/how-to-make-windows-batch-file-pause-when-double-clicked/12036163#12036163).

De cette façon, si vous cliquez sur un fichier batch ou sur un lien (raccourci) depuis l'explorateur Windows, vous pouvez faire en sorte que le programme du fichier batch soit mis en pause avant de se terminer afin que vous puissiez voir la sortie du programme et les éventuels messages d'erreur. En utilisant CHOICE, vous pouvez programmer la possibilité pour l'utilisateur de sélectionner une variété d'actions à prendre, et en utilisant TIMEOUT, vous pouvez laisser la fenêtre se fermer après un délai (sans surveillance). Si vous exécutez le fichier par lots à partir d'une fenêtre d'invite de commande, ces pauses peuvent être gênantes.

La solution liée vous permettra de décider si vous voulez sauter les pauses si le fichier par lots a été exécuté à partir d'une fenêtre d'invite de commande. Vous pouvez en lire plus sur le lien fourni, mais l'essentiel est qu'il utilise la variable d'environnement :

%cmdcmdline%

pour déterminer si le fichier de commandes a été exécuté à partir d'une fenêtre de commande ou non.

Donc, vous l'utilisez comme ceci :

Au point où le fichier de commandes se termine, vous ajoutez du code comme ceci :

echo %cmdcmdline:"=-% | find /i "cmd /c --%~dpf0%-"
if %errorlevel% NEQ 0 goto :EOF
pause
goto :EOF

rem if %errorlevel% EQU 0 batch-file: %~dpf0 was executed from Windows Explorer, ...
rem if %errorlevel% NEQ 0 batch-file: %~dpf0 was executed from within a Command Prompt
1
1
1
2013-03-12 15:30:15 +0000

Le meilleur moyen que j'ai trouvé pour contourner ce problème est d'appeler vos fichiers par lots à partir d'un autre fichier par lots en utilisant start.

donc si vous exécutez normalement un fichier appelé go.bat, alors vous créez un second fichier par lots nommé quelque chose comme go2.bat

le contenu de go2.bat serait juste

start go.bat

la première fenêtre se ferme immédiatement, mais celle qui exécute votre go.bat reste ouverte

1
1
1
2013-09-24 12:30:12 +0000

Cela fonctionne pour la version 5.00 de l'éditeur de registre de Windows.

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

Enregistrez les cmds ci-dessus dans un fichier appelé quelque chose comme cmdbatfile-open.reg et exécutez le !

0
0
0
2017-03-30 08:30:11 +0000

Pour les utilisateurs utilisant Windows 10, notez qu'aucune des réponses ci-dessus ne fonctionne actuellement pour Windows 10.

Pour Windows 10, si vous avez accès au script, vous devez ajouter le code suivant à la fin :

read

Ce code attendra une entrée avant de se fermer.

0
0
0
2019-12-31 21:58:53 +0000

La question de l'OP est beaucoup plus complexe que ce dont j'avais besoin, et cette réponse s'adresse donc aux autres personnes qui viennent ici à la recherche d'un moyen simple de lancer un programme en ligne de commande et de garder la fenêtre ouverte après la sortie du programme en ligne de commande.

Dans mon cas, je voulais lancer NodeJS et garder la fenêtre de la console ouverte après l'arrêt de NodeJS. Voici ma solution :

Fichier : RunNodeJS.bat

@echo off
cd /d c:\
cmd.exe /k cmd /c node

J'ai ensuite créé un raccourci vers ce fichier sur mon bureau et j'ai double-cliqué sur le raccourci pour lancer une console cmd.exe qui exécute la commande du nœud et reste ouverte après sa sortie (la commande du nœud).

J'ai utilisé cmd.exe /k cmd /c node à cause d'une autre réponse donnée ici.

0
0
0
2017-06-30 03:30:27 +0000

En réponse à la rétrogradation de PSIXO - “Cette réponse était déjà couverte dans la question. - Ro Yo Mi 20 janv. ‘16 à 5:06” – Non, ce n'était pas le cas. Les réponses précédentes l'étaient : “pause”, ce qui n'a PAS fonctionné. La réponse de PSIXO a été : “Non, ce n'est pas ça : ”& pause", ce qui fonctionne. Veuillez analyser plus attentivement avant de déclasser. Je l'ai lancé à partir d'un prompt IDLE, et cela a fonctionné :

>>> os.system('dir ^ & pause')
    0
    >>>

D'autre part :

>>> os.system('dir ^ pause')
    1
    >>>

N'a PAS fonctionné (le prompt cmd s'est retourné, et a en fait renvoyé une erreur (1)). Merci à PSIXO pour la réponse dont j'avais besoin. Henry.