Précédent   Forum du club des développeurs et IT Pro > Autres langages > Général Visual Basic 6 et VBScript > VBScript
VBScript Le forum d'entraide sur VBScript. Avant de poster -> La FAQ VBScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/12/2012, 06h54   #1
greg-44
 
Homme greg
Administrateur systèmes et réseaux
Inscription : 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
greg-44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 09h48   #2
ProgElecT
Rédacteur/Modérateur
 
Avatar de ProgElecT
 
Homme Francis MILLET
Inscription : décembre 2004
Messages : 3 212
Détails du profil
Informations personnelles :
Nom : Homme Francis MILLET
Âge : 57
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Secteur : Communication - Médias

Informations forums :
Inscription : décembre 2004
Messages : 3 212
Points : 5 712
Points : 5 712
Envoyer un message via MSN à ProgElecT
Salut greg-44, bienvenue sur DVP
Citation:
......
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.
ProgElecT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 13h19   #3
mikhailo
Membre du Club
 
Avatar de mikhailo
 
Mikhail D.
Inscription : mars 2010
Messages : 78
Détails du profil
Informations personnelles :
Nom : Mikhail D.
Âge : 29

Informations forums :
Inscription : mars 2010
Messages : 78
Points : 59
Points : 59
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
mikhailo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 14h51   #4
greg-44
 
Homme greg
Administrateur systèmes et réseaux
Inscription : 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
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
greg-44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 16h52   #5
tsuji
Membre chevronné
 
Inscription : octobre 2011
Messages : 423
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 423
Points : 698
Points : 698
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
tsuji est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 17h53   #6
ProgElecT
Rédacteur/Modérateur
 
Avatar de ProgElecT
 
Homme Francis MILLET
Inscription : décembre 2004
Messages : 3 212
Détails du profil
Informations personnelles :
Nom : Homme Francis MILLET
Âge : 57
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Secteur : Communication - Médias

Informations forums :
Inscription : décembre 2004
Messages : 3 212
Points : 5 712
Points : 5 712
Envoyer un message via MSN à ProgElecT
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.
ProgElecT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2012, 19h08   #7
tsuji
Membre chevronné
 
Inscription : octobre 2011
Messages : 423
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 423
Points : 698
Points : 698
Citation:
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.
tsuji est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h00.


 
 
 
 
Partenaires

Hébergement Web