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 :

Problème 'Do While Loop' avec "ExecNotificationQuery"


Sujet :

VBScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème 'Do While Loop' avec "ExecNotificationQuery"
    Bonjours,
    Voila il y a deux jours je me suis acheter un livre "autoformation aux scripts" de ed Wilson, je suis au chapitre 2 sur les boucles, et la on apprend le "do while ... loop" il donne un script en exemple helas celui-ci ne fonctionne pas, j'ai beau cherche je ne trouve pas.
    voici le scripte en question :

    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
    Option Explicit
    'On Error Resume Next
    Const FIVE_SEC =5000
    Const LOCAL_HARD_DISK = 3
    Dim colMonitoredDisks
    Dim objWMIservice
    Dim objDiskChange
    Dim i
     
    Set objWMIService = GetObject("winmgmts:" _
    	& "{impersonationLevel=impersonate}").ExecQuery _
    	("SELECT * FROM Win32_process")
     
    Set colMonitoredDisks = objWMIService.ExecNotificationQuery _
        ("Select * from __instancemodificationevent within 30 where TargetInstance isa Win32_LogicalDisk")
     
    i=0
    Do While i = 0
    	Set objDiskChange = colMonitoredDisks.NextEvent
    		If objDiskChange.TargetInstance.DriveType = LOCAL_HARD_DISK Then
    			If objDiskChange.TargetInstance.Size < 100000000 Then
    			WScript.Echo "L'espace disque libre est inferieur a 100 Kilo Octets."
    			WScript.Sleep(FIVE_SEC)
    	End If
    End If
    Loop
    je suis preneur si quelqu'un trouve le problème dans ce script, sans toucher a l'en-tête et aux référence.
    merci d'avance

  2. #2
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 180
    Points
    17 180
    Par défaut
    Salut greg-44, bienvenue sur DVP
    ......
    les boucles, et la on apprend le "do while ... loop" il donne un script en exemple helas celui-ci ne fonctionne pas
    ........
    Qu'est qui ne fonctionne pas pour toi?
    Ce qui est sûr c'est que tu dois rester bloqué dans la boucle car i n’évolue pas, tant qu'il reste a zéro, la condition Do While reste vraie donc reste dans la boucle.
    Pour sortir il faut que i soit inégal à zéro, pour cela il faut que dans la boucle il y est une instruction qui change sa valeur.
    Donc, soit tu n'as pas fait un bon copier/coller et/ou tu as modifié/oublié une partie du code, ou encor, le code proposé dans le livre n'est pas valide.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Membre régulier Avatar de mikhailo
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 78
    Points : 75
    Points
    75
    Par défaut
    Oui, ce script n'est cense produire des resultats visibles que si ton espace disque devient inferieur a 100ko. Si tu veux des resultats "palpables", remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    If objDiskChange.TargetInstance.Size < 100000000 Then
    			WScript.Echo "L'espace disque libre est inferieur a 100 Kilo Octets."
    			WScript.Sleep(FIVE_SEC)
    	End If
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WScript.Echo "Mon espace disque libre: " & objDiskChange.TargetInstance.Size
    ...et mets un intervalle de temps plus grand que 5000 ms, sinon tu seras submerge de fenetres

    Au sujet de i = 0 suivi par Do While i = 0, je pense que c'est mieux d'ecrire directement "Do While True", c'est plus lisible et ca n'utilise pas une obscure variable.
    "Les hommes et les femmes qui, sans bouger de leur bureau ou de leur bibliotheque, sans développer leur puissance corporelle et leurs infinies dimensions, parviennent, par une opération de la conscience, à une tristesse pessimiste qui se pretend lucide ne font que constater, sans le savoir, que toute identification du multiple de la vie à la vacuite de la conscience mène inévitablement à ce pessimisme et cette impuissance."

    extrait de "La fragilité" de Benasayag

  4. #4
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    La boucle fonctionne tres bien vous avez pu voir que j'ai mis le "On Error Resume Next" en commentaire car le script me lancai la msgbox tout les 5 secondes comme demande alors que aucun disque avait moins de 100ko.
    une fois le "On Error Resume Next" en commentaire j'ai vu que j'avais une erreur sur la ligne 14 Caractere 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set colMonitoredDisks = objWMIService.ExecNotificationQuery _
        ("Select * from __instancemodificationevent within 30 where TargetInstance isa Win32_LogicalDisk")
    alors que j'ai chercher sur internet et l'orthographe est bon je pense que sa vien de la ligne au dessus qui marche mais qui ne va pas chercher les bons arguments et etant limitte en connaissance VBS et encore plus en WMI,
    voila pourquoi je vous ecris essayer le chez vous, vous comprenderez peu etre mieux.
    merci de vos reponses

  5. #5
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je n'ai pas le livre mentionné. Mais, le script ne peut pas être correct pour multiple raison.

    [1] D'abord, méfiez-vous pour quelque livre que ce soit qui met la directrice On Error au début d'un script comme ça. Cela vient de quelque autorité du sujet que ce soit, peu importe.

    [2] Le service qui va executer la méthode de ExecNotificationQuery() n'est pas établi correctement: le moniker et tout n'en sont pas.

    [3] La déclaration pour l'ExecNotificationQuery() est fausse, voir les commentaires.

    [4] Il faut presque toujours, en vbscript, convertir la valeur de Size, qui est du type uint64, au Double pour faire des comparisons.

    Ceux-là semblent suffis sinon ça devient tout à fait ridicule... et j'ignore la pertinence du message et tout d'autres.

    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
    Option Explicit
    'On Error Resume Next    'jamais ou presque
    Const FIVE_SEC =5000
    Const LOCAL_HARD_DISK = 3
    Dim colMonitoredDisks
    Dim objWMIservice
    Dim objDiskChange
    Dim i
     
    Set objWMIService = GetObject("winmgmts:" _
    	& "{impersonationLevel=impersonate}://./root/cimv2")
     
    Set colMonitoredDisks = objWMIService.ExecNotificationQuery _
        ("Select * from __instancemodificationevent within 30 where TargetInstance isa 'Win32_LogicalDisk'")    'attention aux placements des apostrophes
     
    i=0
    Do While i = 0
    	Set objDiskChange = colMonitoredDisks.NextEvent
    		If objDiskChange.TargetInstance.DriveType = LOCAL_HARD_DISK Then
    			If cdbl(objDiskChange.TargetInstance.Size) < 100000000 Then    'convertir au Double est nécessaire en vbscript
    			WScript.Echo "L'espace disque libre est inferieur a 100 Kilo Octets."
    			WScript.Sleep(FIVE_SEC)
    	End If
    End If
    Loop

  6. #6
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 180
    Points
    17 180
    Par défaut
    Pour moi le vrai danger est le bouclage infini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    i = 0
    Do While i = 0
        'Set objDiskChange = colMonitoredDisks.NextEvent
        '    If objDiskChange.TargetInstance.DriveType = LOCAL_HARD_DISK Then
        '        If CDbl(objDiskChange.TargetInstance.Size) < 100000000 Then    'convertir au Double est nécessaire en vbscript
        '        WScript.Echo "L'espace disque libre est inferieur a 100 Kilo Octets."
        '        WScript.Sleep (FIVE_SEC)
        '    End If
        'End If
    Loop
    Erreur de code qu'il est dommage de trouver dans un livre intitulé autoformation aux scripts, s'adressant donc plus particulièrement à un débutant, si bien sûr il s'agit bien d'un copier/coller exacte.

    Motif de l'édit:
    un code qui fonctionne, avec sortie de la boucle
    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
    Const FIVE_SEC = 5000
    Const LOCAL_HARD_DISK = 3
    Dim colMonitoredDisks
    Dim objWMIservice
    Dim objDiskChange
    Dim i
                                                                          '://./root/cimv2  ?????
    Set objWMIservice = GetObject("winmgmts:{impersonationLevel=impersonate}:/root/cimv2")
     
    Set colMonitoredDisks = objWMIservice.ExecNotificationQuery _
        ("Select * from __instancemodificationevent within 30 where TargetInstance isa 'Win32_LogicalDisk'")
     
    'i = 0
    Do 'While i = 0
        Set objDiskChange = colMonitoredDisks.NextEvent
            If objDiskChange.TargetInstance.DriveType = LOCAL_HARD_DISK Then
                    MsgBox objDiskChange.TargetInstance.Size
                    Exit do
            End If
    Loop
    après son lancement il faut attendre une vingtaine de secondes avant d'avoir le message.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  7. #7
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Pour moi le vrai danger est le bouclage infini
    Je ne dirais pas c'est un danger, pas de cette façon. C'est l'idée de surveillance perpétuelle que l'on puisse ne pas d'accord.

    Si on veut se limiter de surveiller au maximum 5 évenements de ce genre ou quelque nombre d'autre à notre gré, on peut faire ça. (Si 5 évenements tous méritent un signal d'alert, met le i=i+1 dedans l'autre if ... end if un niveau desous.)
    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
     
    dim maxCount
    maxCount=5
    i=0
    Do While i < maxCount
    	Set objDiskChange = colMonitoredDisks.NextEvent
    	If objDiskChange.TargetInstance.DriveType = LOCAL_HARD_DISK Then
    		If cdbl(objDiskChange.TargetInstance.Size) < 100000000 Then    'convertir au Double est nécessaire en vbscript
    			WScript.Echo "L'espace disque libre est inferieur a 100 Kilo Octets."
    			WScript.Sleep(FIVE_SEC)
    			'i=i+1    'different besoin
    		End If
    		i=i+1
    	End If
    Loop
    En tous cas un loop est la norme de ce genre du script de consummation d'évenement... les différences sont au niveau de détail selon le besoin de chacun.

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/02/2008, 17h50

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