2009-12-25 12 views
0

Je travaille sur un projet pour capturer diverses métriques de performance de disque à l'aide de VBScript et j'aimerais utiliser une sous-procédure avec un objet comme argument. Dans les exemples de code suivants, l'objet auquel je fais référence est objitem.AvgDiskQueueLength qui fournira une valeur pour la longueur de la file d'attente de disque. Je n'ai pas trouvé un moyen de le faire fonctionner car il est reconnu comme une chaîne et ne capture pas la valeur. Mon but est de rendre facile à quiconque de changer les compteurs qui doivent être capturés en n'ayant à faire qu'un changement dans un endroit (l'argument d'appel de procédure). La façon dont j'y vais n'est peut-être pas la meilleure mais je suis ouvert aux suggestions. L'appel de procédure secondaire est ci-dessous.Passage d'objets en tant qu'arguments dans VBScript

PerfCounter "Average Disk Queue Length", "disk_queueLength", "objItem.AvgDiskQueueLength" 

Le code suivant est la sous-procédure.

Sub PerfCounter(CounterDescription, CounterLabel, CounterObject) 
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfDisk_PhysicalDisk",,48) 
    args_index = args_index + 1 
    arrCriteria = split(command_line_args(args_index),",") 
    strDriveLetter = UCase(arrCriteria(0)) 
    intCriticalThreshold = arrCriteria(1) 
    intWarningThreshold = arrCriteria(2) 
    For Each objItem in colItems 
    With objItem 
    WScript.Echo "objitem.name = " & objitem.name 
    If InStr(objItem.Name, strDriveLetter & ":") > 0 Then 
     intChrLocation = InStr(objItem.Name, strDriveletter) 
     strInstanceName = Mid(objItem.Name, intChrLocation, 1) 
    End If 
    If strDriveLetter = strInstanceName AND InStr(objItem.Name, strDriveLetter & ":") > 0 Then 
     If intActiveNode = 1 OR Len(intActiveNode) < 1 Then 
     WScript.Echo "CounterDescription = " & CounterDescription 
     WScript.Echo "CounterLabel = " & CounterLabel 
     WScript.Echo "CounterObject = " & CounterObject 
     If CInt(CounterOjbect) => CInt(intCriticalThreshold) Then 
      arrStatus(i) = "CRITICAL: " & strDriveLetter & ": " & CounterDescription 
      arrTrendData(i) = CounterLabel & "=" & CounterObject 
      intExitCode = 2 
      arrExitCode(i) = intExitCode 
     ElseIf CInt(CounterOjbect) => CInt(intWarningThreshold) AND CInt(CounterObject) < CInt(intCriticalThreshold) Then 
      arrStatus(i) = "WARNING: " & strDriveLetter & ": " & CounterDescription 
      arrTrendData(i) = CounterLabel & "=" & CounterObject 
      intExitCode = 1 
      arrExitCode(i) = intExitCode 
     Else 
      arrStatus(i) = "OK: " & strDriveLetter & ": " & CounterDescription 
      arrTrendData(i) = CounterLabel & "=" & CounterObject 
      intExitCode = 0 
      arrExitCode(i) = intExitCode 
     End If 
     Else 
      PassiveNode CounterDescription, CounterLabel 
     End If 
     End If 
    End With 
    Next 
    i = i + 1 
    ReDim Preserve arrStatus(i) 
    ReDim Preserve arrTrendData(i) 
    ReDim Preserve arrExitCode(i) 
End Sub 

Répondre

2

Pourquoi ne puis vous le faites ...

PerfCounter "Average Disk Queue Length", "disk_queueLength", objItem.AvgDiskQueueLength 
0

Pour passer un objet, vous devez passer un objet, pas une chaîne.
Pour que cette méthode fonctionne comme prévu, vous devez avoir l'objet avant l'appel de la procédure, mais dans votre exemple de code, il semble que vous essayez de transmettre un objet que vous n'avez pas. Un exemple de réalisation:

Set objFSO = CreateObject("Scripting.FileSystemObject") 
UseFileSystemObject objFSO 

Sub UseFileSystemObject(objfso) 
'Now I can use the FileSystemObject in this procedure. 
End Sub 

Mais la procédure d'appel UseFileSystemObject comme cela ne fonctionnera pas,

UseFileSystemObject "objFSO" 

parce que vous passez dans une chaîne pas un objet.
La seule façon que je peux penser pour accomplir ce que vous voulez est d'utiliser une instruction select pour écrire l'attribut approprié de l'objet, quelque chose comme ceci. Donc, dans la sélection vous auriez

Call PerfCounter "Average Disk Queue Length", "disk_queueLength", "AvgDiskQueueLength" 

Sub PerfCounter(CounterDescription, CounterLabel, CounterObjectAttribute) 
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfDisk_PhysicalDisk",,48) 
    For Each objItem in colItems 
     Select Case CounterObjectAttribute 
      Case "ObjectAttribute1" 

      Case "ObjectAttribute2" 

      Case "AvgDiskQueueLength" 
       Wscript.Echo objItem.AvgDiskQueueLength 
     End Select 
    Next 
End Sub 

pour ajouter un cas pour chaque attribut qui peut être utilisé, mais il vous permettra de passer une chaîne dans la procédure. Je pourrais être loin de cela, mais je ne sais pas comment vous pouvez passer un objet si vous n'avez pas l'objet en premier.