0

VBScript を使用してさまざまなディスク パフォーマンス メトリックを取得するプロジェクトに取り組んでおり、オブジェクトを引数としてサブ プロシージャを使用したいと考えています。次のコード サンプルで参照しているオブジェクトはobjitem.AvgDiskQueueLength、ディスク キューの長さの値を提供します。文字列として認識され、値をキャプチャしないため、機能させる方法が見つかりませんでした。私の目標は、1 つの場所 (プロシージャ コールの引数) を変更するだけで、キャプチャするカウンターを誰でも簡単に変更できるようにすることです。私がこれについて行っている方法は最善ではないかもしれませんが、私は提案を受け入れています. サブ プロシージャ コールは次のとおりです。

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
4

2 に答える 2

2

どうしてこれができないの...

PerfCounter "Average Disk Queue Length", "disk_queueLength", objItem.AvgDiskQueueLength
于 2009-12-25T06:04:07.507 に答える
0

オブジェクトを渡すには、文字列ではなくオブジェクトを渡す必要があります。
このメソッドを期待どおりに機能させるには、プロシージャ呼び出しの前にオブジェクトが必要ですが、コード例では、持っていないオブジェクトを渡そうとしているように見えます。実際の例:

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 では、使用できる属性ごとにケースを追加する必要がありますが、プロシージャに文字列を渡すことができます。私はこれについてはかなりずれているかもしれませんが、最初にオブジェクトを持っていない場合、オブジェクトを渡す方法がわかりません。

于 2009-12-28T19:09:31.673 に答える