[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:
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:
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é...)