Передача объектов в качестве аргументов в VBScript - PullRequest
0 голосов
/ 25 декабря 2009

Я работаю над проектом по сбору различных метрик производительности диска с использованием VBScript и хотел бы использовать подпроцедуру с объектом в качестве аргумента. В следующих примерах кода объект, на который я ссылаюсь, - objitem.AvgDiskQueueLength, который предоставит значение для длины очереди диска. Я не нашел способ заставить его работать, так как он распознается как строка, а затем не захватывает значение. Моя цель состоит в том, чтобы облегчить кому-либо изменение счетчиков, которые должны регистрироваться, путем внесения изменений только в одном месте (аргумент вызова процедуры). То, как я это делаю, может быть не лучшим, но я открыт для предложений. Вызов подпрограммы приведен ниже.

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

Следующий код является подпроцедурой.

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

Ответы [ 2 ]

2 голосов
/ 25 декабря 2009

Почему ты не можешь сделать это ...

PerfCounter "Average Disk Queue Length", "disk_queueLength", objItem.AvgDiskQueueLength
0 голосов
/ 28 декабря 2009

Чтобы передать объект, вы должны передать объект, а не строку.
Чтобы этот метод работал должным образом, вы должны иметь объект до вызова процедуры, но в вашем примере кода похоже, что вы пытаетесь передать объект, которого у вас нет. Рабочий пример:

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

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

Но вызов такой процедуры UseFileSystemObject не будет работать,

UseFileSystemObject "objFSO"

потому что вы передаете строку, а не объект.
Единственный способ, которым я могу придумать, чтобы выполнить то, что вы хотите, - это использовать оператор select для записи соответствующего атрибута объекта, что-то вроде этого.

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

Таким образом, в select вы должны добавить регистр для каждого атрибута, который можно использовать, но это позволит вам передать строку в процедуру. Я мог бы быть далеко в этом, но я не знаю, как вы можете передать объект, если у вас нет объекта первым.

...