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 :

Liste & Pointeur !


Sujet :

VBScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut Liste & Pointeur !
    Bonjour,

    Je travaille actuellement sur un script vb touchant à du WMI.
    j'ai une requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set SystemItems = objWMISystem.ExecQuery("SELECT * FROM Win32_NTLogEvent where Logfile='System' ", "WQL", &h10, &h20)
    Pour parcourir cette liste de résultat, j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each objItem In SystemItems
       ...blablabla...
    Next
    Mais ce que j'aimerais faire, c'est parcourir la liste jusqu'à un certain point avec une condition (ce que je fais avec un if dans la boucle et un "Exit For" dans le if) faire différents traitements et ensuite revenir AU MEME point que je m'étais arrété de la liste !!
    Mais avec le For Each, je ne peux pas le faire...

    N'y a-t-il pas un autre moyen ?

    J'aurais bien vu un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    While condition non atteinte
        SystemItems.GetItem.Next (avec une fonction qui existe...:?)
    Loop
    Comme ceci, lorsque je veux repartir sur ma liste, j'aurais gardé une sorte de pointeur sur l'élément courant !

    Une idée ???

  2. #2
    Membre expérimenté
    Inscrit en
    Mai 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 189
    Par défaut
    Avec Do While ca devrait bien marcher nan ?

    une petite variable qui passe de 0 à 1 dès que condition atteinte
    et une petite variable pour rappeler ou le script en était (si nécessaire)

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    Ben oui c'est ce que je voudrais faire !!
    Mais comment récupérer les éléments pointés par "SystemItems" (résultats de la requête) sans passer par ce fameux "for each...in..." ???

    C'est ça que j'aimerais arriver à faire !

  4. #4
    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 : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    un truc du genre :
    ou
    Je crois que c'est le deuxième mais j'ai un doute.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    A priori ça ne marche pas...

    J'ai essayé :
    SystemItems(i)
    SystemItems.items(i)
    SystemItems.GetItems(i)
    SystemItems.Obj(i)
    SystemItems.Object(i)
    SystemItems.GetObj(i)
    SystemItems.GetObject(i)

    (tout ça du style : WScript.Echo SystemItems(i).EventCode car quand j'utilise la requête avec le for each objItem..., je me sers du WScript.Echo objItem.EventCode)

    ...
    D'autres suggestions ? (ou alors un exemple de code avec le SystemItems.Items(i) qui marche...)

    Merci par avance pour votre aide !

  6. #6
    Membre chevronné Avatar de pitchalov
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 340
    Par défaut
    Citation Envoyé par zz2f3 Voir le message
    Mais ce que j'aimerais faire, c'est parcourir la liste jusqu'à un certain point avec une condition (ce que je fais avec un if dans la boucle et un "Exit For" dans le if) faire différents traitements et ensuite revenir AU MEME point que je m'étais arrété de la liste !!
    Mais avec le For Each, je ne peux pas le faire...

    N'y a-t-il pas un autre moyen ?
    Es-tu sûr qu'il est nécessaire de sortir de ta boucle For pour faire tes traitements?
    Car sinon tu mets ton traitement dans une fonction, histoire de pas charger ton For, et ça passe à l'élément suivant après ton traitement.
    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For Each objItem In SystemItems
       If condition Then Traitement(objItem)
    Next
    Ou alors, une autre possibilité, je sais pas si c'est possible en fonction ce que tu veux faire, ce serait de stocker tous tes objItem dans un tableau (ou un vecteur) dans ta boucle For, et après d'effectuer tes traitements en gérant à ta sauce le tableau.

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    C'est une bonne idée...
    Mais je ne pense pas que ce soit possible dans ma situation... (j'ai deux boucles For imbriquées et évidemment c'est sur la 2ème que le problème se pose !)

    En gros, l'algo de mon script est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Pour tous les résultats de la requete (lister tous les éléments du journal des évènements "System") faire :
              Switch case suivant l'EventCode des résultats
              Cas 1 : blablabla
              Cas 2 : blablabla
              Cas autre : je fais une requete (lister les éléments du journal des évènements "Security")
                              je compare la date de chacun de ces évènements pour retrouver l'évènement juste après la date de celui du journal "System"
                              j'effectue des opérations
    fin pour
    Le truc c'est que vu que le résultats des requetes sont triés par date, il est inutile de repartir à chaque fois du début dans le "Cas autre" vu que la date de tous ceux que j'aurais déjà traité pour un objet "System" antérieur est forcément avant celle que je recherche !

    Donc si il y a un moyen quelconque de changer la structure de l'algo ou d'avoir un code me permettant d'accéder à un élément (sans passer par le for each) ce serait cool !!

    Sinon la solution du tableau peut être envisagée... mais le résultat de la requête à stocker possède plus de 100 000 éléments !!! Ca va faire un énorme tableau pour rien je pense...

  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 : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Pourquoi ne pas stocker la date du dernier élément, et mettre une condition pour ne faire les traitements qu'à partir de cette date ?

    Mais si tu repars du début avec la condition tu devrais passer très rapidement les premiers éléments.

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    Je ne sais pas c'est c'est ce que tu as voulu me dire mais tu m'as donné une excellente idée !!!!
    (je réduis le temps considérablement !)

    Du coup, je mets la condition dans la requete sur le journal "Security" (pour ma 2eme boucle for)

    MERCI BEAUCOUP !!!!

    A titre indicatif pour que ça marche, il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req = "SELECT * FROM Win32_NTLogEvent where Logfile='System' and TimeWritten > ' " + TPS_VOULU + "'"
    Et ensuite ma boucle For Each.... (qui du coup commence là où je veux !!!)


    MERCI !!

  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 : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    C'est presque ce que j'avais voulus dire.
    Je parlais d'une condition dans la boucle, mais c'est vrai que la mettre dans la requête c'est mieux. Cela réduit tout simplement ta liste.

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    Il y a un truc que je ne comprends pas...
    Comment expliquez vous ceci :

    Lorsque je "scanne" tous les résultats et que je cherche un élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    "SELECT * FROM Win32_NTLogEvent where Logfile='System'"
    For Each objItem In SystemItems
        if objItem.TimeWritten < (une certaine date)
            blablabla...
            exit for
        end if
    Next

    l'objItem qui "rentre" dans le IF est différent de celui du code ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    "SELECT * FROM Win32_NTLogEvent where Logfile='System' where TimeWritten<=(une certaine date)"
    For Each objItem In SystemItems
        if objItem.TimeWritten < (une certaine date)
            blablabla...
            exit for
        end if
    Next

    Je comprends pas... Une idée ? (par ce que du coup, vu que je n'ai pas le même résultat, mon problème reste entier... je ne peux pas utiliser de where pour accélérer ma requête !)
    Ca voudrait dire que le résultat n'est pas classé dans le même ordre non ? Mais alors comment faire !!

  12. #12
    Membre chevronné Avatar de pitchalov
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 340
    Par défaut
    Es-tu sûr de ta requête SQL ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM Win32_NTLogEvent where Logfile='System' where TimeWritten<=(une certaine date)"
    Elle me paraît bizarre avec ces 2 where...

    Essaie avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM Win32_NTLogEvent where Logfile='System' and TimeWritten<=(une certaine date)"
    Après je m'y connais pas plus que ça en requêtes, alors si ce que j'ai dit est faux, ne pas prendre en compte

  13. #13
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    Non tu as raison....
    Mais j'ai juste mal recopié dans mon poste (dans mon code c'est bien un "and").

    J'ai fait mes petites recherches et en faite ce n'est pas une requête SQL mais WQL (W pour WMI) et il n'y a pas de possibilité de faire de "ORDER BY TimeWritten DESC" comme en sql...

    De plus j'ai fait affiché le résultat des 2 requêtes et c'est bien ce que je disais, les résultats ne sont pas triés de la même façon.... Du coup cette solution tombe à l'eau (sauf si il existe une sorte d'équivalent à ce "Order By" en WMI...

    Le problème reste donc toujours entier !

  14. #14
    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 : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Il y a une chose que je n'ai pas bien compris :
    Est ce que dans ta boucle tu mets une condition sur la date pour ne pas gérer les éléments qui n'ont pas la date désirée ?
    Si oui, malgrès cette condition, la gestion est longue ?
    Si non, essaye avec une telle condition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM Win32_NTLogEvent where Logfile='System' where TimeWritten<=(une certaine date)"
    Pour cette requête, ta liste est bien plus petite que l'autre ?

    Sinon une solution du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM Win32_NTLogEvent where Logfile='System' where TimeWritten=(une certaine date)"
    Avec plusieurs requêtes pour les différentes à traiter, le tout placer dans un dictionnaire. Est ce que cela pourraît convenir ?

    Bref ordonner toi même et ensuite parcourir.

  15. #15
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    Le problème c'est que lorsque je fait la requete sans condition de date, le résultat est trié par ordre chronologique décroissant (comme le journal des évènements et c'est ce que je veux).

    Lorsque je rajoute la condition sur la date (pour n'avoir que "la fin" du journal), le résultat n'est pas trié !!! (j'ai fait le test des deux requêtes en affichant tous les résultats et j'ai vu que dans le 2ème cas, le résultat n'était pas trié comme le 1er cas...)

    Donc j'ai essayé en rajoutant une clause du type "order by desc" mais bien évidemment, ce n'est pas su SQL (mais du WQL W pour WMI) et il n'y a pas d'option order by...

    En gros j'ai au départ une liste de 70000 évènements (environ) que je parcours du premier jusqu'à une certaine date. Lorsque j'ai trouvé celui que je cherchais, je sors de la boucle et je fais d'autre traitements.
    Sauf que des fois (pour mon programme), je suis obligé de revenir sur cette liste. Je sais FORCEMENT que l'évènement que je cherche sera après (dans le tableau) celui que j'ai trouvé.
    Donc je voulais n'avoir que les éléments APRES celui que j'ai trouvé (pour éviter de me retaper toute la liste du début...)

    Voilà en gros mon problème...

  16. #16
    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 : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Par défaut
    Donc je voulais n'avoir que les éléments APRES celui que j'ai trouvé (pour éviter de me retaper toute la liste du début...)
    Après avoir trouvé ton élément, tu peut finir ton parcours de boucle et stocker le reste des éléments dans un tableau/dictionnaire pour avoir en stock une liste plus petite.
    Tu perds du temps la première fois mais les autres fois c'est plus rapide.

    Cela marche bien si tu n'as pas besoin de rafraichir ta liste d'événement, si tu n'as pas besoin d'avoir les nouveaux.

    Si tu as besoins de prendre en compte les nouveaux éléments tu n'as pas d'autre choix que de faire une nouvelle requête.

    Sinon Win32_NTLogEvent ne possède pas un id ?
    Peut être qu'avec une requête genre id >= id_élément_trouvé cela pourrait faire ce que tu souhaites ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/10/2006, 15h33
  2. [LG]Liste de pointeurs
    Par kmitz dans le forum Langage
    Réponses: 10
    Dernier message: 02/04/2005, 02h57
  3. [LG]Liste de pointeurs de type pointer
    Par tom_snop dans le forum Langage
    Réponses: 4
    Dernier message: 29/03/2005, 23h40
  4. fuite de memoire dans une liste de pointeur sur composant
    Par Nicolos_A dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/12/2004, 08h46
  5. [LG]liste chainee + pointeur + affichage
    Par k_ro dans le forum Langage
    Réponses: 6
    Dernier message: 17/01/2004, 13h58

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