Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1

    Homme Profil pro greg
    Administrateur systèmes et réseaux
    Inscrit en
    décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme greg
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2012
    Messages : 4
    Points : -1
    Points
    -1

    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 :
    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
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro Francis MILLET
    Inscrit en
    décembre 2004
    Messages
    3 492
    Détails du profil
    Informations personnelles :
    Nom : Homme Francis MILLET
    Âge : 58
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 3 492
    Points : 6 367
    Points
    6 367

    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.

  3. #3
    Membre du Club Avatar de mikhailo
    Profil pro Mikhail D.
    Inscrit en
    mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Nom : Mikhail D.
    Âge : 30

    Informations forums :
    Inscription : mars 2010
    Messages : 78
    Points : 64
    Points
    64

    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 :
    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 :
    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

    Homme Profil pro greg
    Administrateur systèmes et réseaux
    Inscrit en
    décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Nom : Homme greg
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2012
    Messages : 4
    Points : -1
    Points
    -1

    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 :
    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 Expert
    Inscrit en
    octobre 2011
    Messages
    672
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 672
    Points : 1 174
    Points
    1 174

    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 :
    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
    Rédacteur/Modérateur
    Avatar de ProgElecT
    Homme Profil pro Francis MILLET
    Inscrit en
    décembre 2004
    Messages
    3 492
    Détails du profil
    Informations personnelles :
    Nom : Homme Francis MILLET
    Âge : 58
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Secteur : Communication - Médias

    Informations forums :
    Inscription : décembre 2004
    Messages : 3 492
    Points : 6 367
    Points
    6 367

    Par défaut

    Pour moi le vrai danger est le bouclage infini
    Code :
    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 :
    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.

  7. #7
    Membre Expert
    Inscrit en
    octobre 2011
    Messages
    672
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 672
    Points : 1 174
    Points
    1 174

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •