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

VBScript Discussion :

Détecter la terminaison d'un processus.


Sujet :

VBScript

  1. #1
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut Détecter la terminaison d'un processus.
    Bonjour,

    Je me remet au VBScript depuis quelque temps et j'ai constaté que j'ai oublié quelque astuce

    Bon la j'ai un petit problème, mon code me semble bon mais ce n'est pas le cas. Je cherche à détecter la fin d'un processus dont j'ai l'ID.

    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
    Sub Test_Main(Debug, CurrentTestSet, CurrentTSTest, CurrentRun)
      ' *** VBScript Limitation ! ***
      ' "On Error Resume Next" statement suppresses run-time script errors.
      ' To handle run-time error in a right way, you need to put "If Err.Number <> 0 Then"
      ' after each line of code that can cause such a run-time error.
      On Error Resume Next
     
      ' clear output window
      TDOutput.Clear
     
      dim ee
      Set objWMIService = GetObject("winmgmts:\\.\root\cimv2:Win32_Process")
      objWMIService.Create """C:\Program Files\TTworkbenchBasic\ttman.bat""" & " -l c:\temp\test -r excel " & """C:\Documents and Settings\uspa8495\workspace\TTsuite-SIP_3.1.1\ttcn3\RFC3261\test.clf""", "C:\Program Files\TTworkbenchBasic\", null, ee
      waitforexit ee
      Set objWMIService = nothing
     
      Set objFSO = CreateObject("Scripting.FileSystemObject")
      Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
      Set colFiles = objWMIService.ExecQuery("Select * from CIM_DataFile where Path = '\\temp\\'")
      'Set AttacheFile = CurrentRun.Attachments
      'For Each objFile in colFiles
      'Set AttacheItem = AttacheFile.AddItem(Null)
      '  AttacheItem.FileName = "C:\temp\" & objFile.Name
      '  AttacheItem.Type=1
      '  AttacheItem.Post 'Mise à jour de la modification sur le serveur de TestDirector.
      'Next
      'Set AttacheFile = nothing
      'Set AttacheItem = nothing
     
      If Not Debug Then
      End If
      ' handle run-time errors
      If Err.Number <> 0 Then
        TDOutput.Print "Run-time error [" & Err.Number & "] : " & Err.Description
        ' update execution status in "Test" mode
        'If Not Debug Then
        '  CurrentRun.Status = "Failed"
        '  CurrentTSTest.Status = "Failed"
        'End If
      End If
    End Sub
     
    function waitforexit(ee)
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Pid = '" & ee & "'")
    if not IsNull(colProcesses) then
    XTools.Sleep(1000) 'Code testdirector, c'est un sleep :D
    waitforexit ee
    end if
    end function
    Le code en commentaire c'est du code TestDirector, pour ceux que cela interesse, ...

    Bon le problème est dnas wiatforexit, je ne sors pas de ma récursivité.

    Vous allez me dire qu'elle idée de passer par la récursivité, je fais un foreach et je met le set colprocesses dedans et je test sa nullité et c'est moins dangereux
    Ok mais bon j'aimerais comprendre pouquoi cela ne fonctionne pas.

  2. #2
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Quelle idée d'utiliser la récursivité, si tu avais .... bon bref


    tu n'aurais pas oublié d'affecter ee avant l'appel récursif ?

  3. #3
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Bon ok ma variable n'est pas tres parlante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objWMIService.Create """C:\Program ....\ttman.bat""" & " -l c:\temp\test -r excel " & """C:\Documents ...\test.clf""", "C:\Program ...\", null, ee
    Normalement Create y affecte le PID du processus Créé

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    j'ai pas l'habitude d'utiliser WMIService.. mais à priori ton test IsNull ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process ")
    wscript.Echo IsNull(colProcesses)
    renvoi faux ...!
    faudrai voir du coté de colProcesses.Count ..? peu-être ...

    ensuite vérifier ce que renvoi ee ..?


    pour PID il faut mettre ProccesID:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessID=2636")

  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Tiens une proposition de solution pour ta fonction récursive :

    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
     
    wscript.echo "Avant"
    waitforexit(6028)
    wscript.echo "Aprés"
     
    function waitforexit(ee)
    On Error Resume next
    Dim i 
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Processid = " & ee & "")
    i = 0
    i = colProcesses.Count
    Wscript.echo i
    if i > 0 then
    Wscript.Sleep(1000) 'Code testdirector, c'est un sleep :D
    waitforexit ee
     
    end if
    end function
    pour tester je lance la caculatrice de windows , je récupère le processid grâce à la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    C:\Documents and Settings\bbil>tasklist /FI "IMAGENAME eq calc.exe"
     
    Nom de l'image              PID  Nom de la sessio Numéro d Utilisation
    ========================= ====== ================ ======== ============
    calc.exe                    6028 Console                 0     3 072 Ko
    je remplace le n° de PID 6028 dans le script....Et voila...

    Avant
    1
    1
    1
    1
    1
    1
    1
    1
    0
    Après

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Merci de t'être pencher sur le problème.

    Comme tu l'as montré IsNull marche, puisque la collection de tous les process (select *) de la machine n'est certaine pas vide

    Mais il semblerait tout simplement que si la collection est vide, l'objet est quand même renvoyé et donc il n'est pas null mais count est à 0.
    D'ailleurs je viens de retrouver un bout de code que j'ai ecrit il y longtemps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'sipp.exe'")
     
                        'La présence de processus SiPp, non terminés, signifie qu'il y a eu une erreur durant le test.
                         If colProcessList.count <> 0 Then
                            err.number = 902 'L'objet Err de VBS est utilisé pour gérer les erreurs.
                            err.description = "Des scenarios SiPp se sont mal terminés"
                            ErrorFile path, Err 'Ajout du descriptif de l'erreur dans le fichier "erreur" généré.
                            err.clear
                         End If
    J'utilisais count

    pour PID il faut mettre ProccesID:
    En effet je n'avais pas vérifier la véracité de la syntaxe sql.

    Pour l'ensemble de mon oeuvre je merriterais la voir

    Je vérifie si cela marche et je met le tag résolu

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par ced600 Voir le message
    ...
    Comme tu l'as montré IsNull marche, puisque la collection de tous les process (select *) de la machine n'est certaine pas vide ...
    eu ... te moque pas ... j'ai pas montré le bon exemple ... enfin comme tu la compris je voulais dire qu'Ici IsNull nous renvoi toujours 0

  8. #8
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Oui en fait je l'utilisais pour d'autre objet WMI que je récupérais car ceux-ci pouvaient ne pas être récupéré.

  9. #9
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Voici ma fonction presque finale (faut que je change le nom de la variable )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function waitforexit(ee)
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where ProcessID = '" & ee & "'")
    if not IsNull(colProcesses) then
       If colProcesses.Count <> 0 Then
          XTools.Sleep(1000)
          waitforexit ee
       End If
    else
    'Utiliser Err pour mettre un statut d'erreur.
    end if
    end function
    Cela marche très bien et c cool cela

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Je vérifie si cela marche et je met le tag résolu
    Je suis un peu lent à la détente.

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

Discussions similaires

  1. comment détecter le démarage d'un processus.
    Par saidgrd dans le forum Général Java
    Réponses: 1
    Dernier message: 09/07/2009, 12h57
  2. contôler la terminaison d'un processus
    Par youp_db dans le forum Windows
    Réponses: 7
    Dernier message: 03/04/2008, 21h25
  3. Détecter la fermeture d'un processus
    Par skeltryx dans le forum Windows
    Réponses: 2
    Dernier message: 14/05/2007, 09h21
  4. Détecter la fin de son processus
    Par locs dans le forum Delphi
    Réponses: 12
    Dernier message: 09/02/2007, 14h19
  5. détecter session windows depuis un processus system
    Par Eric 90 dans le forum Delphi
    Réponses: 7
    Dernier message: 30/10/2006, 17h59

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