Comment récupérer le résultat d'une commande DOS dans une variable

Résolu
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013 - 15 févr. 2012 à 15:29
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013 - 11 avril 2012 à 17:17
Bonjour

je viens d'arriver a exécute une commande Dos ( Tasklist) à partir du Java , mon but suivant et de récupérer une donner spécifique qui est le PID d'un processus dont on connais le nom :
* comme vous voyez dans le résultats afficher je voudrai juste récupérer le PID d'un process et de le stocker dans une variable .
Merci d'avance

Here is the standard output of the command:

result:84:
Nom de l'image PID Nom de la sessio Num‚ro de s Utilisation
======================= ======== ================ =========== ============
System Idle Process 0 Services 0 24 Ko
System 4 Services 0 192 Ko
smss.exe 316 Services 0 52 Ko
csrss.exe 460 Services 0 628 Ko
csrss.exe 516 Console 1 10ÿ424 Ko
wininit.exe 524 Services 0 60 Ko
winlogon.exe 572 Console 1 56 Ko
services.exe 620 Services 0 3ÿ208 Ko
lsass.exe 628 Services 0 2ÿ740 Ko
lsm.exe 636 Services 0 904 Ko
svchost.exe 736 Services 0 1ÿ956 Ko
svchost.exe 812 Services 0 2ÿ624 Ko
svchost.exe 900 Services 0 5ÿ260 Ko
svchost.exe 940 Services 0 34ÿ112 Ko
svchost.exe 968 Services 0 9ÿ628 Ko
svchost.exe 1100 Services 0 2ÿ064 Ko
svchost.exe 1208 Services 0 4ÿ192 Ko
spoolsv.exe 1432 Services 0 1ÿ052 Ko
svchost.exe 1472 Services 0 4ÿ564 Ko
svchost.exe 1584 Services 0 2ÿ816 Ko
RIconMan.exe 1616 Services 0 260 Ko
lkads.exe 1660 Services 0 512 Ko
LMIGuardianSvc.exe 1700 Services 0 164 Ko
ramaint.exe 1744 Services 0 484 Ko
LogMeIn.exe 1804 Services 0 3ÿ204 Ko
nimxs.exe 1872 Services 0 344 Ko
nidmsrv.exe 1892 Services 0 492 Ko
SystemWebServer.exe 1948 Services 0 1ÿ108 Ko
tagsrv.exe 2020 Services 0 868 Ko
sftvsa.exe 2088 Services 0 52 Ko
WLIDSVC.EXE 2268 Services 0 312 Ko
lkcitdl.exe 2340 Services 0 484 Ko
lktsrv.exe 2428 Services 0 616 Ko
sftlist.exe 2504 Services 0 580 Ko
WLIDSVCM.EXE 2696 Services 0 48 Ko
ApplicationWebServer.exe 3040 Services 0 1ÿ848 Ko
nimdnsResponder.exe 3084 Services 0 472 Ko
nipxism.exe 3140 Services 0 496 Ko
nipalsm.exe 3296 Services 0 520 Ko
niDiscSvc.exe 3320 Services 0 52 Ko
CVHSVC.EXE 3760 Services 0 56 Ko
taskhost.exe 4012 Console 1 1ÿ148 Ko
dwm.exe 4080 Console 1 1ÿ532 Ko
explorer.exe 2188 Console 1 12ÿ216 Ko
svchost.exe 1300 Services 0 688 Ko
RtHDVCpl.exe 2968 Console 1 160 Ko
igfxtray.exe 3008 Console 1 144 Ko
hkcmd.exe 3048 Console 1 104 Ko
igfxpers.exe 3152 Console 1 168 Ko
LogMeInSystray.exe 3220 Console 1 2ÿ216 Ko
nidevmon.exe 3264 Console 1 148 Ko
jusched.exe 3364 Console 1 52 Ko
Linkury.exe 3716 Console 1 23ÿ048 Ko
nierserver.exe 3848 Console 1 108 Ko
igfxsrvc.exe 2224 Console 1 484 Ko
SearchIndexer.exe 4504 Services 0 15ÿ324 Ko
wmpnetwk.exe 4680 Services 0 1ÿ876 Ko
IAStorDataMgrSvc.exe 3940 Services 0 1ÿ324 Ko
svchost.exe 4404 Services 0 7ÿ072 Ko
chrome.exe 2788 Console 1 41ÿ596 Ko
chrome.exe 2300 Console 1 6ÿ920 Ko
chrome.exe 4524 Console 1 124 Ko
chrome.exe 3636 Console 1 1ÿ404 Ko
taskhost.exe 4412 Console 1 100 Ko
rundll32.exe 4176 Console 1 668 Ko
chrome.exe 3532 Console 1 20ÿ636 Ko
chrome.exe 5852 Console 1 476 Ko
taskmgr.exe 4352 Console 1 52 Ko
eclipse.exe 700 Console 1 161ÿ084 Ko
chrome.exe 5704 Console 1 118ÿ504 Ko
chrome.exe 4332 Console 1 29ÿ992 Ko
chrome.exe 1864 Console 1 107ÿ720 Ko
AcroRd32.exe 3744 Console 1 1ÿ852 Ko
chrome.exe 3824 Console 1 17ÿ396 Ko
notepad++.exe 5532 Console 1 1ÿ812 Ko
SearchProtocolHost.exe 5608 Services 0 4ÿ836 Ko
SearchFilterHost.exe 1488 Services 0 3ÿ796 Ko
javaw.exe 2144 Console 1 11ÿ236 Ko
tasklist.exe 4856 Console 1 4ÿ448 Ko
conhost.exe 3908 Console 1 2ÿ724 Ko
WmiPrvSE.exe 4664 Services 0 4ÿ980 Ko

30 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
15 févr. 2012 à 15:55
Voilà, c'est fait, à toi de l'adapter pour ton programme. Je t'ai fais une fonction pour récupérer le pid et je te donne également une main pour que tu testes.

	public static String recupererPID(String s){
String res="";
String patternStr = "[^0-9]*([0-9]*).*";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(s);
boolean matchFound = matcher.find();
if (matchFound && matcher.groupCount()>=1) {
res = matcher.group(1);
}
return res;
}
public static void main(String[] args) {
String ligne1 = "System Idle Process 0 Services 0 24 Ko ";
String ligne2 = "System 4 Services 0 192 Ko ";

System.out.println(recupererPID(ligne1));
System.out.println(recupererPID(ligne2));


}
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
15 févr. 2012 à 15:58
Là, tu as tout sous la forme d'une seule chaine, tu peux donc faire un
String[] lignes = result.split("\n")
De cette manière, tu obtiendras un tableau contenant toutes les lignes.

Tu ne t'intéresses qu'aux lignes à partir de 2 ou 3 et tu appliques la fonction à tous les autres éléments du tableau
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
15 févr. 2012 à 16:08
Voilà les import à réaliser :

import java.util.regex.Matcher;
import java.util.regex.Pattern;


Tu n'utilises pas un IDE qui fait ca pour toi ?
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
16 févr. 2012 à 10:14
C'est peut être un problème de majuscule system -> System

As tu affiché le contenu de ton tableau ? Contient il les bonnes infos ?
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
16 févr. 2012 à 10:32
c'est Bon Julien j'ai trouver l'erreur , il fallait juste que je change la variable a chercher en pattern et que j'utilise pour comparer la methode contains(pattern) :

code :
String patternStr3="LogMeIn.exe";

for (int i=0;i<str.length;i++)
{

if(str[i].contains(patternStr3))
{
System.out.println("Nom Process :"+str[i]+"\t Pid Process :"+ str2[i]);
}


}


Output :


Here is the standard output of the command:

Nom Process :LogMeIn.exe Pid Process :1836
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
16 févr. 2012 à 10:43
Ouf, on y arrive enfin !

Content que ton problème soit résolu.

a+
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
15 févr. 2012 à 15:39
Bonjour,

Pour cela, il faut que tu découpes ton fichier ligne à ligne à l'aide de StringTokenizer ou à l'aide de split :

String ligne = "System Idle Process 0 Services 0 24 Ko ";
String[] mots = ligne.split("\p{Space}");
System.out.println(mots[2]);
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
15 févr. 2012 à 15:42
Oups, je n'avais pas fais attention, il y a plusieurs espaces avant d'obtenir le PID, il faut donc utiliser les regex pour reconnaitre une structure, je te fais ca et je te le poste dans 10 minutes.
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
15 févr. 2012 à 15:42
Merci Julien je vais voir ça ,et je posterai mon résultats après
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
15 févr. 2012 à 15:52
voila julien je poste mon code s'il peut vous aidez :



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;import java.io.*;
import java.util.ArrayList;


public class Main {
public static void main(String[] args) throws IOException {


Process p = Runtime.getRuntime().exec("tasklist");

// read the standard output of the command
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

System.out.println("Here is the standard output of the command:\n");

int count = 0;
String s;

String result = "";
while (!procDone(p)) {
while ((s = stdInput.readLine()) != null) {


count++;
result = result + s + "\n";
}
}

System.out.println("result:" + count + ": " + result);
stdInput.close();
}

private static boolean procDone(Process p) {
try {
int v = p.exitValue();
return true;
} catch (IllegalThreadStateException e) { return false ;}
}
}
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
15 févr. 2012 à 16:02
Merci Julien

juste un truc ,j'ai pas compris la variable patternStr = "[^0-9]*([0-9]*).*"; ,et pour quoi tu la initialisé a cette valeur .
pour la classe Matcher ,est ce que je doit l'inclure avec un import ??
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
15 févr. 2012 à 16:16
Pour l'explication de l'expression régulière : quand on ne connait pas, ca a l'air d'être vraiment du chinois mais c'est assez simple en réalité.

Les expressions régulières sont des chaines de caractères qui permettent de définir une structure par exemple, tu peux tester qu'une chaine est formée d'un chiffre puis d'en ensemble de caractères ( ^[0-9].*).

Pour cela, on utiliser une certaine syntaxe : [0-9] signifie un chiffre (123456879), [a-z] signifie une lettre. On peut utiliser des négations [^0-9] signifie un caractère qui n'est pas un chiffre.

Pour dire "plusieurs chiffres", on place une étoile après [0-9] : [0-9]*

Cette expression [^0-9]*[0-9]*.* signifie donc plusieurs caractères qui ne sont pas des chiffres suivi de plusieurs chiffres suivi d'autres caractères (. représente un caractère quelconque).

Pour les parenthèses autour de ([0-9]*) signifient qu'on va capturer le groupe de plusieurs chiffres (le pid)

C'est un peu complexe à utiliser mais très puissant. Tu vois le truc ?
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
15 févr. 2012 à 16:17
Si Si j'utilise Eclipse ,pour la classe Pattern il ma bien dit quoi importer , mais pour la classe Matcher non.

juste Julien j'aimerai comprendre c'est trois lignes s'il vous plait :
String patternStr = "[^0-9]*([0-9]*).*";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(s);
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
15 févr. 2012 à 16:24
Merci pour l'explication , Julien si je veux par exemple entrer un nom de processus qui est affiché dans la liste et récupérer spécifiquement son PID ,que dois je faire dans ce cas ?

Merci
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
15 févr. 2012 à 16:42
Tu peux récupérer nom du processus avec l'expression "([^0-9]*)\p{Space}[0-9].*". a ta place, je crérais une Map contenant le nom du processus et le pid.

Je te laisse essayer. Si tu as des soucis, demande moi. Par contre, je ne pourrai pas te répondre avant demain matin
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
15 févr. 2012 à 16:48
Merci Julien , je vais voir comment résoudre ça .
Merci bcp pour votre aide
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
16 févr. 2012 à 10:09
Bonjour Julien ,j'ai terminer sur le truc de hier mais j'ai un petit soucie , en faite je passe pas par une Map comme tu ma dit ,j'ai utilisé juste de tableau de String dans le premier je stock le nom du Process et le deuxiéme son PID.
je les affiche ,mais lorsque je compare avec le premier tableau pour que je trouve l'indice comme ça je retourne son PID ::il le trouve pas ...voici mon code :

public static String recupererPID(String s)

{


int nbr_pid=0;

String res="";
String res2="";

String patternStr2="[^0-9]*([0-9]*).*";
String patternStr ="([^0-9]*)[0-9].*";




////// Dans la tableau "res" on stock les Nom des process
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(s);
boolean matchFound = matcher.find();
if (matchFound && matcher.groupCount()>=1) {
res = matcher.group(1);
//System.out.println("je l'ai trouvé");
}


///////Dans la tableau "res2" on stock les PID des process
Pattern pattern2 = Pattern.compile(patternStr2);
Matcher matcher2 = pattern2.matcher(s);
boolean matchFound2 = matcher2.find();
if (matchFound2 && matcher2.groupCount()>=1) {
res2 = matcher2.group(1);
//System.out.println("je l'ai trouvé");
}



String str[]=res.split("/"); // les Nom des Pids
String str2[]=res2.split("/"); // les PID des Process





for (int i=0;i<str.length;i++)
{
String found="system";


if(found.equals(str[i])==true) {
System.out.println("Nom Process :"+str[i]+"\t Pid Process :"+ str2[i]);
}
else System.out.println("Pas Trouvé");
}

return res;


}
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
16 févr. 2012 à 10:16
si si j'affiche les bons résultats meme avec Majuscule ou Minuscule ça marche pas , moi je me demande est ce que c'est pas pas la methode SPLIT qui ma causé ça

Here is the standard output of the command:

Nom Process : Pid Process :
Nom Process : Pid Process :
Nom Process : Pid Process :
Nom Process :System Idle Process Pid Process :0
Nom Process :System Pid Process :4
Nom Process :smss.exe Pid Process :316
Nom Process :csrss.exe Pid Process :480
Nom Process :wininit.exe Pid Process :520
Nom Process :csrss.exe Pid Process :528
Nom Process :winlogon.exe Pid Process :576
Nom Process :services.exe Pid Process :620
Nom Process :lsass.exe Pid Process :636
Nom Process :lsm.exe Pid Process :644
Nom Process :svchost.exe Pid Process :752
Nom Process :svchost.exe Pid Process :828
Nom Process :svchost.exe Pid Process :908
Nom Process :svchost.exe Pid Process :968
Nom Process :svchost.exe Pid Process :1008
Nom Process :svchost.exe Pid Process :1152
Nom Process :svchost.exe Pid Process :1364
Nom Process :spoolsv.exe Pid Process :1488
Nom Process :svchost.exe Pid Process :1516
Nom Process :svchost.exe Pid Process :1620
Nom Process :RIconMan.exe Pid Process :1652
Nom Process :lkads.exe Pid Process :1688
Nom Process :LMIGuardianSvc.exe Pid Process :1736
Nom Process :ramaint.exe Pid Process :1812
Nom Process :LogMeIn.exe Pid Process :1836
Nom Process :nimxs.exe Pid Process :1904
Nom Process :nidmsrv.exe Pid Process :1924
Nom Process :SystemWebServer.exe Pid Process :2016
Nom Process :tagsrv.exe Pid Process :116
Nom Process :sftvsa.exe Pid Process :2124
Nom Process :WLIDSVC.EXE Pid Process :2396
Nom Process :lkcitdl.exe Pid Process :2428
Nom Process :lktsrv.exe Pid Process :2552
Nom Process :WLIDSVCM.EXE Pid Process :2888
Nom Process :ApplicationWebServer.exe Pid Process :3080
Nom Process :nimdnsResponder.exe Pid Process :3116
Nom Process :nipxism.exe Pid Process :3172
Nom Process :nipalsm.exe Pid Process :3348
Nom Process :niDiscSvc.exe Pid Process :3372
Nom Process :CVHSVC.EXE Pid Process :3880
Nom Process :svchost.exe Pid Process :4012
Nom Process :mscorsvw.exe Pid Process :1272
Nom Process :taskhost.exe Pid Process :2608
Nom Process :dwm.exe Pid Process :2188
Nom Process :explorer.exe Pid Process :3768
Nom Process :SearchIndexer.exe Pid Process :2524
Nom Process :RtHDVCpl.exe Pid Process :3020
Nom Process :igfxtray.exe Pid Process :4000
Nom Process :hkcmd.exe Pid Process :3784
Nom Process :igfxsrvc.exe Pid Process :4116
Nom Process :igfxpers.exe Pid Process :4128
Nom Process :LogMeInSystray.exe Pid Process :4136
Nom Process :nidevmon.exe Pid Process :4184
Nom Process :jusched.exe Pid Process :4212
Nom Process :Linkury.exe Pid Process :4268
Nom Process :nierserver.exe Pid Process :4332
Nom Process :wmpnetwk.exe Pid Process :4784
Nom Process :eclipse.exe Pid Process :6076
Nom Process :IAStorDataMgrSvc.exe Pid Process :4564
Nom Process :svchost.exe Pid Process :5244
Nom Process :SearchProtocolHost.exe Pid Process :5900
Nom Process :chrome.exe Pid Process :5520
Nom Process :chrome.exe Pid Process :2648
Nom Process :chrome.exe Pid Process :2352
Nom Process :chrome.exe Pid Process :164
Nom Process :chrome.exe Pid Process :4584
Nom Process :chrome.exe Pid Process :6112
Nom Process :rundll Pid Process :32
Nom Process :chrome.exe Pid Process :5040
Nom Process :chrome.exe Pid Process :5140
Nom Process :WmiPrvSE.exe Pid Process :4264
Nom Process :audiodg.exe Pid Process :4092
Nom Process :WmiPrvSE.exe Pid Process :1188
Nom Process :SearchFilterHost.exe Pid Process :2944
Nom Process :javaw.exe Pid Process :6092
Nom Process :tasklist.exe Pid Process :5924
Nom Process :conhost.exe Pid Process :488
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
16 févr. 2012 à 10:22
Je ne comprend pas du tout ce que tu fais avec ta méthode split ??

Peux tu poster ton code en utilisant la colorisation syntaxique (troisième bouton en partant de la droite, et choisis java)
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
16 févr. 2012 à 10:27
Voilà une méthode qui marche pour récupérer le pid associé à un processus :

public static String recupererPID(String nomProcessus, List<String> processus){
String res="";
String patternStr = nomProcessus+"\\p{Space}([0-9]*).*";
Pattern pattern = Pattern.compile(patternStr);
for(String s : processus){
Matcher matcher = pattern.matcher(s);
boolean matchFound = matcher.find();
if (matchFound && matcher.groupCount()>=1) {
res = matcher.group(1);
}
}
return res;
}
public static void main(String[] args) {
List<String> lignes = new ArrayList<String>();
lignes.add("System Idle Process 0 Services 0 24 Ko ");
lignes.add("System 4 Services 0 192 Ko ");
System.out.println(recupererPID("System", lignes));
}
0
Rejoignez-nous