IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Ouvrir l'invite de commandes MS-DOS


Sujet :

Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Ouvrir l'invite de commandes MS-DOS
    Bonjour

    J'aimerais savoir comment faire pour ouvrir l'invite de commande MS-DOS, y copier une ligne de commande et l'exécuter le tout bien sûr sans avoir à taper la commande + ENTREE : je veux que tout s'exécute automatiquement.

  2. #2
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    alors, un petit ShellExecute et une connaissance des options de ligne de commande de l'utilitaire de ligne de commande (excusez la totologie) donne ceci (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'cmd.exe', '/C "ping www.developpez.com"',0,SW_SHOWDEFAULT);
    note l'usage du paramètre /C suivi de la commande à exécuter entre doubles quotes

  3. #3
    Invité
    Invité(e)
    Par défaut
    Le shellexecute doit être déclaré auparavant en tant que procédure ?

    A quoi sert le "SW_SHOWDEFAULT" ? Est-il nécessaire ?
    Dernière modification par Invité ; 12/08/2008 à 13h08.

  4. #4
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    shellexecute est définie dans l'unité ShellApi je crois bien (à inclure dans les uses des ton unité donc).
    pour la définition des paramètres, regarder l'aide de la fonction dans l'aide du SDK windows.

  5. #5
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    salut;
    tu peux aussi utiliser SW_HIDE au lieu de SW_SHOWDEFAULT, ceci marche tres bien avec C++, ceci vas te permettre de ne pas afficher une fenetre la fenetre DOS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'cmd.exe', '/C "ping www.developpez.com"',0,SW_HIDE);
    If you type Google into Google, you Can break the internet" - The IT Crowd

  6. #6
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir,

    A noter que certains Pare-feu réagissent assez mal à cette manip.

    Exemple KAV alertant en disant que le fichier Ping.exe est modifié

    De quoi déboussoler plus d'un utilisateur.

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    si tu as pleins de commandes, tu peux passer par un fichier .bat ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    @evarisnea

    Le seul souci c'est que ça ouvre l'invite de commande et que ça n'exécute aucune action.

    La commande n'est même pas affichée.
    Es-tu sûre de la syntaxe ?

    PS : j'utilise delphi 7

  9. #9
    Invité
    Invité(e)
    Par défaut
    @evarisnea

    ça y est : en fait le code qui marche est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'cmd.exe', PChar('/C "ping www.developpez.com"'),0,SW_SHOWDEFAULT);
    2 dernières questions (et après je vous laisse (normalement) tranquilles lol) :

    => comment garder la commande ping visible lors de l'action ?

    => voici mon instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'cmd.exe', PChar('/C ExtractShortPathName(EncExe) +current_job.cmdenc+ " -o NUL "+JobData.Input'),0,SW_SHOWDEFAULT);
    :
    les trucs en rouges étant des variables, je ne sais pas si la syntaxe de tout ce bidule est correcte ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    En gros la ligne de commande à copier donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F:\x264-CLI_r928\x264.exe --progress --thread-input -B 1378 -p 1 --stats "statsfile.pass" -A "p8x8,b8x8" -b 2 --direct auto --subme 5 --me "hex" -o NUL 1.avs
    avec

    "ExtractShortPathName(EncExe)" qui est "F:\x264-CLI_r928\x264.exe"

    "current_job.cmdenc" qui est "--progress --thread-input -B 1378 -p 1 --stats "statsfile.pass" -A "p8x8,b8x8" -b 2 --direct auto --subme 5 --me "hex""

    "JobData.Input" qui est "1.avs"

  11. #11
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par gizmo27 Voir le message
    @evarisnea

    ça y est : en fait le code qui marche est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'cmd.exe', PChar('/C "ping www.developpez.com"'),0,SW_SHOWDEFAULT);
    je n'ai pas eu de problème avec le code précédemment posté (sans le transtypage explicite en PChar)
    Citation Envoyé par gizmo27 Voir le message
    => comment garder la commande ping visible lors de l'action ?
    eh bien, quel type d'application utilises-tu ? à priori je ne voyais pas de souci, je n'ai même pas d'abord compris le pourquoi de ta question. c'est en testant le code dans une application console que je me suis rendu compte que rien ne s'affichait pourtant dans une application GUI win32 pas de souci.
    Citation Envoyé par gizmo27 Voir le message
    => voici mon instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, 'open', 'cmd.exe', PChar('/C ExtractShortPathName(EncExe) +current_job.cmdenc+ " -o NUL "+JobData.Input'),0,SW_SHOWDEFAULT);
    :
    les trucs en rouges étant des variables, je ne sais pas si la syntaxe de tout ce bidule est correcte ? En gros la ligne de commande à copier donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F:\x264-CLI_r928\x264.exe --progress --thread-input -B 1378 -p 1 --stats "statsfile.pass" -A "p8x8,b8x8" -b 2 --direct auto --subme 5 --me "hex" -o NUL 1.avs
    avec

    "ExtractShortPathName(EncExe)" qui est "F:\x264-CLI_r928\x264.exe"

    "current_job.cmdenc" qui est "--progress --thread-input -B 1378 -p 1 --stats "statsfile.pass" -A "p8x8,b8x8" -b 2 --direct auto --subme 5 --me "hex""

    "JobData.Input" qui est "1.avs"
    a priori, j'écrirais ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ShellExecute(
      0, 
      'open', 
      'cmd.exe', 
      PChar(
        '/C ' + 
        ExtractShortPathName(EncExe) + ' ' +
        current_job.cmdenc + ' -o NUL ' +
        JobData.Input), 
      0, 
      SW_SHOWDEFAULT );
    ou alors en passant par une variable que je testerais en chaque fois en mode déboguage pour vérifier son contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    parametre :=     '/C ' + 
        ExtractShortPathName(EncExe) + ' ' +
        current_job.cmdenc + ' -o NUL ' +
        JobData.Input);
    ShellExecute(
      0, 
      'open', 
      'cmd.exe', 
      PChar(parametre), 
      0, 
      SW_SHOWDEFAULT );

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ok ça fonctionne parfaitement maintenant.

    Dernière chose :

    comment attendre que le programme soit terminé pour passer à autre chose ?

    Je sais qu'il y a la fonction ExecuteandWait

    J'ai pensé à un truc du genre ExecuteandWait(shellexecute.................

    Mais je ne sais pas trop.

  13. #13
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    en s'inspirant de la faq peut être un code comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    procedure TForm1.Button2Click(Sender: TObject);
    Var  StartInfo   : TStartupInfo;
         ProcessInfo : TProcessInformation;
         Fin         : Boolean;
         EncExe :string;
    begin
      { Mise à zéro de la structure StartInfo }
      FillChar(StartInfo,SizeOf(StartInfo),#0);
      { Seule la taille est renseignée, toutes les autres options }
      { laissées à zéro prendront les valeurs par défaut }
      StartInfo.cb     := SizeOf(StartInfo);
     
      { Lancement de la ligne de commande }
      If CreateProcess(
          Nil, 
          '"cmd.exe" ' + PChar(
            '/C ' +       
            ExtractShortPathName(EncExe) + ' ' +
            current_job.cmdenc + ' -o NUL ' +
            JobData.Input), 
          Nil, 
          Nil, 
          False,
          0, 
          Nil, 
          Nil, 
          StartInfo,
          ProcessInfo) Then
      Begin
        { L'application est bien lancée, on va en attendre la fin }
        { ProcessInfo.hProcess contient le handle du process principal de l'application }
        Fin:=False;
        Repeat
          { On attend la fin de l'application }
          Case WaitForSingleObject(ProcessInfo.hProcess, 200)Of
            WAIT_OBJECT_0 :Fin:=True; { L'application est terminée, on sort }
            WAIT_TIMEOUT  :;          { elle n'est pas terminée, on continue d'attendre }
          End;
          { Mise à jour de la fenêtre pour que l'application ne paraisse pas bloquée. }
          Application.ProcessMessages;
        Until Fin;
        { C'est fini }
        ShowMessage('Terminé');
      End
      Else RaiseLastOSError;
    End;
    cette fois la fonction utilisée est CreateProcess

  14. #14
    Invité
    Invité(e)
    Par défaut
    Cela implique que je garde mon instru shellexecute non ?
    En appelant cette procédure juste la ligne après ça devrait marcher non ?

  15. #15
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par gizmo27 Voir le message
    Cela implique que je garde mon instru shellexecute non ?
    non
    Citation Envoyé par gizmo27 Voir le message
    En appelant cette procédure juste la ligne après ça devrait marcher non ?
    non
    il faut remplacer l'appel à ShellExecute par le code de cette procédure.
    plus d'explications dans les commentaires du code.

  16. #16
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup.

    Dernier truc : j'ai vu que tu avais mis le paramètre /C avant la ligne de commande : à quoi correspond-il ? Y'en-a-t-il d'autres ?

  17. #17
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    /C est un paramètre pour l'application cmd.exe qui indique au programme qu'il doit exécuter la chaîne qui suit le paramètre puis terminer l'application.

    Fait un

    Pour plus d'infos sur les paramètres possibles pour cmd.exe
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 13
    Points
    13
    Par défaut Les fichiers batch
    Citation Envoyé par Coussati Voir le message
    si tu as pleins de commandes, tu peux passer par un fichier .bat ?
    Salut,

    J'ai beaucoup lu des articles sur la création de ces types de fichiers mais je ne comprend toujours pas comment réaliser de choses plus intéressantes. Alors, aidez-moi donc à créer ces types de fichiers avec des instructions un peu plus complexes telles que:
    1- Utiliser la commande DISKPART
    2- Formater un lecteur amovible (flash)
    3- En gros, utiliser les commandes les plus usuelles de l'invite de commande de windows

    Merci, je compte sur vous.

  19. #19
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par masala Voir le message
    Merci, je compte sur vous.
    Et bien n'y compte pas trop ici non plus !

    Tu ne vas pas chez ton boulanger pour qu'il t’énumère les différentes pièces de bœuf non ?

Discussions similaires

  1. installer invite de commande( DOS)
    Par djemamar dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 26/03/2010, 14h25
  2. [C#] ouvrir et ecrire dans l'invite de commande
    Par Johann7751 dans le forum C#
    Réponses: 6
    Dernier message: 04/06/2009, 17h02
  3. Problème /wait (invite de commande dos)
    Par ludo.guy dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 13/10/2008, 10h48
  4. Masquer l'invite de commande dos
    Par franck06 dans le forum Langage
    Réponses: 6
    Dernier message: 15/01/2008, 11h11
  5. Comment ouvrir une fénêtre de commande DOS
    Par izeba dans le forum Windows XP
    Réponses: 4
    Dernier message: 24/09/2006, 01h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo