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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2018
    Messages : 19
    Points : 16
    Points
    16
    Par défaut [QProcess] Récupérer le résultat de plusieurs commandes cmd
    Bonjour,

    Je souhaiterais développer une méthode permettant de récupérer l'adresse IP de l'interface connectée au réseau.
    Cette méthode serait utilisée dans une interface graphique afin de remplir un champs "Adresse IP" automatiquement.

    Jusqu'ici j'utilisais donc QProcess afin d'exécuter les deux commande suivantes via "cmd.exe":
    - La première permet d'identifier les interfaces connectées: "netsh interface ip show interfaces | findstr /IR \"connected\" | findstr /rv \"disconnected VMware VirtualBox Loopback\"\n"
    - La seconde reprend l'interface trouvée précédemment et donne son IP: "netsh interface ip show ip \""+adapterState+"\" | findstr /ir \"[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\"\n"

    Il suffisait ensuite de récupérer le résultat et de le parser avec "strip()" pour ne garder que l'IP.

    Cependant, mon problème est que lorsque je lance mon process "cmd.exe" et y écrit la première commande, je récupère également le prompt Windows à la lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Microsoft Windows [version 10.0.19042.662]
    (c) 2020 Microsoft Corporation. Tous droits réservés.
     
    C:\Users\Utilisateur>netsh interface ip show interfaces | findstr /IR "connected" | findstr /rv "disconnected VMware VirtualBox Loopback"
    Ma question est donc: comment peut-on ne récupérer que les derniers résultats sur la sortie standard, sans récupérer tous le contenu précédent à chaque nouvelle lecture ?


    Voici le code (ne pas prendre en compte les caractère utilisé par split il s'agit de tests):
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    QString MainWindow::srchIp()
    {
        QProcess processIp;
        processIp.start("cmd.exe");
     
        if(!processIp.waitForStarted(5000)){ //Si le processus ne s'est pas lancé, on stop le programme
            qDebug()<<"ERREUR: Le processus ne s'est pas lancé correctement... Stop.";
            return NULL;
        }
        //On fait une première lecture nulle pour éviter de retrouver le prompt windows au lancement de cmd.exe
        processIp.write("\n");
        processIp.readAllStandardOutput();
     
        //On utilise une commande pour afficher toutes les interfaces et leur état (connecté ou déconnecté). Ne sélectionne que les cartes Ethernet.
        processIp.write("netsh interface ip show interfaces | findstr /IR \"connected\" | findstr /rv \"disconnected VMware VirtualBox Loopback\"\n");
        processIp.closeWriteChannel();
        if(!processIp.waitForFinished(3000)){
            return NULL;
        }
     
        QString  adapterState = processIp.readAllStandardOutput();
        qDebug()<<"\nRésultat de la première commande adapterState: \n"<<adapterState;
     
        //On sépare d'abord le prompt windows du résultat de la commande
        QStringList splitAdapterState = adapterState.split(">");
        adapterState = splitAdapterState[1];
        qDebug()<<"\nNouvelle valeur de adapterState: \n"<<adapterState;
     
        //On split une nouvelle fois pour ne garder que l'interface
        splitAdapterState = adapterState.split("\n");
        adapterState = splitAdapterState.last();
     
     
        qDebug()<<"\nValeur finale de adapterState: "<<adapterState;
     
        //Une fois qu'on a l'interface connecté, on utilise une commande afin de récupéré l'IP de l'interface en question.
        QString cmdAdapterIp = "netsh interface ip show ip \""+adapterState+"\" | findstr /ir \"[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\"\n";
        QByteArray convCmdIp = cmdAdapterIp.toUtf8();
        processIp.write(convCmdIp);
        processIp.closeWriteChannel();
        if(!processIp.waitForFinished()){
            return NULL;
        }
     
        QString adapterIp = processIp.readAll();
        qDebug()<<"\nRésultat de la seconde commande adapterIp: \n"<<adapterIp;
     
        //On sépare d'abord le prompt windows du résultat de la commande
        QStringList splitAdapterIp = adapterIp.split(">");
        adapterIp = splitAdapterIp[1];
        qDebug()<<"\nNouvelle valeur de adapterIp: "<<adapterIp;
        splitAdapterIp = adapterIp.split(" ");
        adapterIp = splitAdapterIp.last();
        qDebug()<<"\nDernière valeur de adapterIp: "<<adapterIp;
     
        return adapterIp;
    }

    Merci à ceux qui s'intéresseront à la question, même si c'est pour donner une autre solution (QNetworkInterfaces me semble plus adapté mais pour ma curiosité...)

  2. #2
    Modérateur

    Avatar de Winjerome
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    10 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 704
    Points : 65 895
    Points
    65 895
    Par défaut
    Bonjour,

    À creuser, il y a probablement un moyen plus simple de récupérer cette info par le biais de la classe QNetworkInterface.

    Sinon au lieu de passer par cmd.exe, tu peux directement exécuter les programmes netsh / findstr, la liaison pipe | se faisant avec setStandardOutputProcess.
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).
    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Mes extensions FireDVP (Firefox), ChroDVP (Chrome) : suivi des nouveaux messages, boutons/raccourcis et bien plus !

Discussions similaires

  1. Récupérer le résultat d'une commande scp
    Par vbcasimir dans le forum Linux
    Réponses: 19
    Dernier message: 20/05/2009, 17h14
  2. Réponses: 3
    Dernier message: 19/06/2007, 12h27
  3. Récupérer le résultat d'une commande shell
    Par espadon1 dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2006, 11h01
  4. Réponses: 2
    Dernier message: 02/01/2006, 11h39
  5. Réponses: 5
    Dernier message: 05/10/2004, 14h05

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