J'essayais de recoder une invite de commande Windows en C #. Je me demandais comment l'invite de commande sait quand attendre la fin du processus et quand ne pas attendre que le processus appelé se termine.
Par exemple, si vous tapez l'invite de commande "notepad", le 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 la fin du programme en cours d'exécution avant de vous permettre d'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 #?
c#
windows
command-prompt
Justin Krejcha
la source
la source
Réponses:
Si l'application est une application GUI Win32, 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.
ÉDITER:
D'ACCORD. Il semble que vous ayez besoin d'explications techniques. Si vous souhaitez émuler la même fonctionnalité dans votre application, vous pouvez vérifier les
IMAGE_OPTIONAL_HEADER
fichiers EXE ici .À l'intérieur
IMAGE_OPTIONAL_HEADER
, il y a:If SubSystem == 0x02
cela signifie que c'est une application GUI.If SubSystem == 0x03
cela signifie que c'est une application d'invite de commande.MODIFIER 2:
Si vous voulez le voir en action:
Télécharger http://www.ntcore.com/exsuite.php
Copiez calc.exe ou notepad.exe sur votre bureau
Ouvrez calc.exe copié dans CFF Explorer
Accédez à En-têtes Nt -> En-têtes facultatifs
Changer le sous-système de 0x002 à 0x003
Sauvegarde le
Maintenant, exécutez le nouveau calcul modifié et vous verrez l'invite de commande attendre qu'il se termine.
la source
La valeur par défaut à partir d'une invite de commande est de générer le programme GUI dans un processus / fork séparé. Cependant, vous pouvez exécuter le bloc-notes (ou un autre programme GUI) en ligne avec votre invite de commande / script shell:
De cette façon, l'invite de commande / le script shell continue uniquement après la fin du processus notepad.exe.
J'espère que cela aide, TW
la source
Lorsque vous démarrez un nouveau processus, une application GUI dans ce contexte qui fonctionne réellement en dehors des limites de l'invite, l'invite n'attendra pas. Mais, si vous exécutez une commande qui fonctionne entièrement sous les limites de l'instance actuelle d'une invite, elle attend.
Ainsi, la commande
notepad
démarre simplement l'application Notepad et laisse le contrôle de l'application. Alors que, la commandeipconfig
s'exécute sous un domaine (non ce n'est pas le domaine d'application ), de l'invite.Pour généraliser extrêmement, lorsque vous utilisez
Process.Start
dans votre équivalent C #, n'attendez pas. Ce ne sera de toute façon pas le cas.la source