121 votes

Créer une nouvelle fenêtre cmd.exe à partir d'une autre invite cmd.exe

Je suis en train de configurer CruiseControl.NET. Le problème que je rencontre est que j'exécute CC en tant qu'application console et que lorsque mon build se termine avec succès et s'exécute (en utilisant exec), il se lance dans l'invite DOS de CruiseControl. J'utilise de simples fichiers batch pour lancer mon application, mais le fait de l'exécuter dans la même invite que CC fait croire à CC que la construction se poursuit tant que mon application s'exécute.

Existe-t-il des paramètres de ligne de commande pour cmd.exe qui fera apparaître une autre fenêtre d'invite séparée ?

1 votes

Cmd.exe est un shell CUI, pas une interface graphique. Il ne crée pas de fenêtres. Il utilise une fenêtre de console qui est créée et gérée par une instance de conhost.exe, le processus hôte de la console. Si un programme CUI est démarré normalement, le code d'initialisation dans la DLL du client de base (kernel32.dll ou kernelbase.dll) hérite de la console du parent, le cas échéant, ou alloue une nouvelle console, à moins qu'il ne soit démarré avec l'indicateur de création DETACHED_PROCESS (c'est-à-dire pas de console). S'il est lancé avec l'indicateur de création CREATE_NEW_CONSOLE (comme le CMD start utilise), la DLL de base alloue toujours une nouvelle console au lieu d'hériter de celle du parent.

232voto

e.James Points 51680

Je pense que ça marche :

start cmd.exe

5 votes

Assurez-vous de vérifier les différentes options de démarrage "start / ?". /wait et /I peuvent être utiles.

53 votes

Pour info, il n'est même pas nécessaire de mettre 'cmd.exe' après 'start'. Le mot 'start' suffit.

0 votes

Start /d <path> Pour ceux qui veulent définir le chemin pour la nouvelle fenêtre cmd. Ici description détaillée.

71voto

xsukax Points 21

Voici le code dont vous avez besoin :

start cmd.exe @cmd /k "Command"

11 votes

Quel est le @cmd faire ? Existe-t-il une documentation à ce sujet ?

1 votes

@ supprime la sortie directe qui devrait normalement apparaître dans l'invite mais la commande sera quand même exécutée.

0 votes

J'ai utilisé cette méthode, elle fonctionne mais si j'essaie de tuer le programme en cours d'exécution par l'interruption du clavier ctrl+c, le programme en cours d'exécution ne s'arrête pas. Il ne s'arrête que lorsque vous fermez la fenêtre d'invite de commande nouvellement ouverte.

22voto

BlackMael Points 1616
start cmd.exe 

ouvre une fenêtre séparée

start file.cmd 

ouvre le fichier batch et l'exécute dans une autre invite de commande

3voto

Michael Points 11
START "notepad.exe"
echo Will launch the notepad.exe application
PAUSE

Pour créer n'importe quel type de fichier cmd, il suffit d'enregistrer le contenu en tant que .bat, c'est-à-dire

@echo
TITLE example.bat
PAUSE
taskkill/IM cmd.exe

Faites-en un fichier "example.bat", enregistrez-le, puis ouvrez-le et exécutez-le.

0voto

kite Points 400

J'ai également essayé d'exécuter un fichier batch qui lance un processus/serveur démon à la fin de la tâche CCNET ; La seule façon de faire en sorte que CruiseControl génère un processus asynchrone indépendant SANS attendre la fin du processus est la suivante :

  1. créer un fichier batch pour exécuter le processus du démon (application serveur)
  2. utiliser le planificateur de tâches pour exécuter le fichier batch en tant que tâche CCNET (en utilisant schtasks.exe)

    schtasks.exe /create /F /SC once /ST 08:50 /TN TaskName /TR "c:/path/to/batchFileName.bat"
    • 08:50 est le format horaire HH:MM

Vous devrez peut-être tuer le processus au démarrage de ccnet.

PS : la réponse choisie utilisant "start cmd.exe" ne fonctionne pas ; une nouvelle invite de commande est effectivement créée, mais CCNET attendra que la commande créée se termine.

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