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

C++Builder Discussion :

Comment rediriger la sortie d'une commande DOS dans une variable ?


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut Comment rediriger la sortie d'une commande DOS dans une variable ?
    Bonjour,

    Je souhaiterais rediriger le résultat d'une commande DOS vers une variable, afin de pouvoir effectuer des actions en fonction du retour...

    Je ne souhaite pas utiliser un fichier temporaire, car une même commande DOS peut être lancée 2 fois simultanément, et l'écriture d'une fichier temporaire pose donc problème.

    Jusqu'à présent, j'utilise ShellExecute, ou le code suivant pour lancer une commande DOS :

    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
    SHELLEXECUTEINFO shInfo;
    DWORD sortie_processus;
    bool shRetour;
     
    repertoire = ExtractFileDir(commande);
    ZeroMemory(&shInfo,sizeof(shInfo));
    shInfo.cbSize=sizeof(shInfo);
    shInfo.hwnd=NULL;
    shInfo.fMask=SEE_MASK_NOCLOSEPROCESS;
    shInfo.lpVerb=NULL;
    shInfo.lpFile=commande.c_str();
    shInfo.lpParameters=parametres.c_str();
    shInfo.lpDirectory=repertoire.c_str();
    shInfo.nShow = SW_HIDE;
    shRetour = ShellExecuteEx(&shInfo);
    Existe-t'il d'autres méthodes me permettant de récupérer le résultat d'une commande DOS ? Merci par avance !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 312
    Points : 411
    Points
    411
    Par défaut
    Je ne sais pas faire ce que tu demande, sinon, si tu es pressé, j'ai 2 idées:

    - Avoir effectivement des fichiers temporaires, mais tu change le nom ( par exemple tu insere la date et l'heure , ou le nombre de ms depuis le demarrage du pc ), quand tu as fini tu supprime ton file.

    - Sinon tu utilise les pipes sous DOS, a ce moment il te faut un autre prog qui soit prevu pour le traitement de ta sortie.

  3. #3
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par nah666 Voir le message
    Je ne sais pas faire ce que tu demande, sinon, si tu es pressé, j'ai 2 idées:

    - Avoir effectivement des fichiers temporaires, mais tu change le nom ( par exemple tu insere la date et l'heure , ou le nombre de ms depuis le demarrage du pc ), quand tu as fini tu supprime ton file.
    jusqu'à présent j'utilisais en effet cette méthode, en donnant au fichier temporaire le nom suivant : temp.Now().FormatString("yymmddhhnnss")

    Mais depuis que j'utilise un TTimer et des Thread, il arrive que la commande soit lancée à la même seconde, et que le nom du fichier de sortie soit donc identique...

    Qu'appelles-tu le "nombre de ms depuis le démarrage du PC" ? Comment récupérer sa valeur ? Merci !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 312
    Points : 411
    Points
    411
    Par défaut
    Tu as une fonction de l'api windows pour ca.

    GetTickCount qu'elle s'appelle la coquine

    "GetTickCount Function

    Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days."

    http://msdn2.microsoft.com/en-us/library/ms724408.aspx

  5. #5
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Merci... mais je pense que le problème restera le même : si ma fonction est lancée 2 fois simultanément, à la même milliseconde près, le nom du fichier sera identique...

    Il n'existe pas une autre fonction qui permettrait de récupérer un autre compteur, par exemple, numéro du thread exécuté, ou je ne sais quoi d'autre, qui soit différent à chaque appel de la fonction ?

    (j'ai pensé également à créer un nom de fichier en prenant un chiffre au hasard, mais il reste tjs la probabilité de tomber 2 fois sur le même chiffre...)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 312
    Points : 411
    Points
    411
    Par défaut
    Bah,

    Autre idée:

    Tu appele ton fichier temp0.txt

    Tu verifie si ce fichier existe, si oui, ben temp1.txt

    etc jusqu'a ce que tu tombe sur un fichier qui existe pas.

  7. #7
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour
    tu peux utiliser CreateProcess pour exécuter l'application souhaitée
    L'API GetExitCodeProcess te retourne le code renvoyé par ton application

    Tu peux également utiliser des PIPES en redirigant la sortie Out et Error de ton pipe vers les variables désirés
    tu a pour cela un exemple que tu peux trouvez chez Codegear

    cordialement

  8. #8
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Merci, j'ai trouvé l'exemple dont tu me parles :

    http://dn.codegear.com/article/10387

    Je vais l'adapter pour C++ Builder !

  9. #9
    Rédacteur
    Avatar de dvsoft
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2002
    Messages : 176
    Points : 622
    Points
    622
    Par défaut
    bonsoir,

    tu peux aussi faire comme ca:

    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
     
    //---------------------------------------------------------------------------
    bool __fastcall DVSDoExecuteProc(AnsiString sCmd)
    {
        STARTUPINFO         si;
        PROCESS_INFORMATION pi;
     
        ZeroMemory(&si,sizeof(si));
        si.cb = sizeof(si);
        ZeroMemory(&pi,sizeof(pi));
        //
        //!Start the child process.
        //
        if (!CreateProcess( NULL,   // No module name (use command line).
             sCmd.c_str(),          // Command line.
             NULL,                  // Process handle not inheritable.
             NULL,                  // Thread handle not inheritable.
             false,                 // Set handle inheritance to FALSE.
             0,                     // No creation flags.
             NULL,                  // Use parent's environment block.
             NULL,                  // Use parent's starting directory.
             &si,                   // Pointer to STARTUPINFO structure.
             &pi)) {                // Pointer to PROCESS_INFORMATION structure.
     
            DVSSysErrorDLG(sCanCreateProcess + sCmd + IntToStr(GetLastError()));
            return false;
        }
        //
        //!Wait until child process exits.
        //
        WaitForSingleObject(pi.hProcess, INFINITE);
        //
        //!Close process and thread handles.
        //
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
        return true;
    }
    Bon courage
    ALain

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécuter une commande SQL dans une commande Dos
    Par meddly dans le forum Sql*Plus
    Réponses: 2
    Dernier message: 21/11/2013, 11h37
  2. [Batch] Une commande DOS dans 1 variable
    Par agdid04 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 21/06/2013, 16h59
  3. Réponses: 9
    Dernier message: 14/12/2010, 12h18
  4. Résultat d'une commande DOS dans une variable
    Par tomix81 dans le forum Général Python
    Réponses: 2
    Dernier message: 18/05/2007, 11h02
  5. lancer une commande dos dans une page ASP
    Par noznoz78 dans le forum ASP
    Réponses: 4
    Dernier message: 13/02/2006, 19h06

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