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

Qt Discussion :

[QProcess] Récupérer le résultat de plusieurs commandes cmd


Sujet :

Qt

  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
    Invité
    Invité(e)
    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.

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, 16h14
  2. Réponses: 3
    Dernier message: 19/06/2007, 11h27
  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, 10h01
  4. Réponses: 2
    Dernier message: 02/01/2006, 10h39
  5. Réponses: 5
    Dernier message: 05/10/2004, 13h05

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