90 votes

Comment l'invite de commande sait-elle quand elle doit attendre la sortie ?

J'essayais de faire un recodage de l'invite de commande Windows en C#. Je me demandais comment l'invite de commande sait quand il faut attendre que le processus lancé se termine, et quand il ne faut pas attendre que le processus appelé se termine.

Par exemple, si vous tapez dans l'invite de commande "notepad", Bloc-notes se lancera, mais vous pourrez toujours exécuter d'autres commandes. Cependant, si vous ouvrez un utilitaire tel que more.com, ping.exe ou un autre utilitaire, il attendra que le programme en cours d'exécution se termine avant de vous laisser exécuter une autre commande.

Comment l'invite de commande sait-elle quand attendre la sortie, et comment ce comportement peut-il être émulé en C# ?

121voto

72DFBF5B A0DF5BE9 Points 2258

Si l'application est une application Win32 GUI, elle s'exécutera simplement et l'invite de commande n'attendra pas qu'elle se termine.

Si l'application est une application console, elle s'exécutera dans l'invite de commande et vous devrez attendre qu'elle se termine pour récupérer l'invite de commande.

EDITAR:

OK. Il semble que vous ayez besoin d'une explication technique. Si vous voulez émuler la même fonctionnalité dans votre application, vous pouvez vérifier IMAGE_OPTIONAL_HEADER de fichiers EXE aquí .

À l'intérieur de IMAGE_OPTIONAL_HEADER il y en a un :

 WORD                 Subsystem;

If SubSystem == 0x02 cela signifie que c'est une application GUI.

If SubSystem == 0x03 ça veut dire que c'est une application d'invite de commande.

EDIT 2 :

Si vous voulez le voir en action :

  1. Télécharger http://www.ntcore.com/exsuite.php

  2. Copiez calc.exe ou notepad.exe sur votre bureau.

  3. Ouvrir le fichier calc.exe copié dans l'Explorateur CFF

  4. Naviguez jusqu'à Nt Headers -> Optional Headers (en anglais)

  5. Modifier le sous-système de 0x002 à 0x003

  6. Sauvegardez-le

Exécutez maintenant le nouveau calc modifié et vous verrez l'invite de commande attendre qu'il soit terminé.

8voto

Tw Bert Points 1345

Par défaut, à partir d'une invite de commande, le programme d'interface graphique est lancé dans un processus/fork séparé. Cependant, vous pouvez exécuter notepad (ou un autre programme GUI) en ligne avec votre invite de commande / shell script :

start /w notepad.exe

De cette façon, l'invite de commande / shell script ne se poursuit qu'après la fin du processus notepad.exe.

J'espère que cela vous aidera, TW

3voto

danish Points 2664

Lorsque vous démarrez un nouveau processus, une application GUI dans ce contexte qui travaille réellement en dehors des limites de l'invite, l'invite n'attendra pas. En revanche, si vous exécutez une commande qui fonctionne entièrement dans les limites de l'instance actuelle de l'invite, celle-ci attend.

Alors, commandez notepad démarre simplement l'application Notepad et laisse le contrôle de l'application. Alors que la commande ipconfig fonctionne sous un domaine (non, ce n'est pas domaine d'application ), de l'invite.

Pour généraliser à l'extrême, lorsque vous utilisez Process.Start dans votre équivalent C#, n'attendez pas. De toute façon, il ne le fera pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X