Jump to content

WMI help for disk read / write bytes per sec


Recommended Posts

WMI provides numerous classes that enable performance monitoring, you can read this document.

This class may be of particular interest for you :  Win32_PerfFormattedData_PerfProc_Process

To use WMI with autoIt, just google it, you will find plenty of examples...

Link to comment
Share on other sites

Okay, so I did a search and modified a piece of code,
there is no script error but the read and write value always remains at 0.
I don't know where my mistake came from, maybe there...

$colProcesses = $objWMIService.ExecQuery("Select * from Win32_PerfFormattedData_PerfProc_Process Where name = '" & $sProcName & "'")

here is the complete code:

$strComputer = "."
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

$process = "explorer.exe"



While 1
    $StartRead = _GetProcTime($process,"r")
    $StartWrite = _GetProcTime($process,"w")
    Sleep(1000)
    $EndRead = _GetProcTime($process,"r")
    $EndWrite = _GetProcTime($process,"w")
    $TotalRead = Int(($EndWrite - $StartWrite))
    $TotalWrite = Int(($EndWrite - $StartWrite))
    ToolTip("explorer.exe" & @CRLF & "Read : " & $TotalRead & " bytes" & @CRLF & "Write: " & $TotalWrite & " bytes", 10, 10, "Read / Write Process per sec")
WEnd

ToolTip("")

Func _GetProcTime($sProcName,$sReadWrite)
    If Not ProcessExists($sProcName) Then Return SetError(1, 0, 0)

    Local $colProcesses, $objProcess, $sngProcessTime

    $colProcesses = $objWMIService.ExecQuery("Select * from Win32_PerfFormattedData_PerfProc_Process Where name = '" & $sProcName & "'")

        For $objProcess in $colProcesses
            If $sReadWrite == "r" Then $sngProcessTime = $objProcess.IOReadBytesPersec
            If $sReadWrite == "w" Then $sngProcessTime = $objProcess.IOReadWritePersec
        Next

    Return $sngProcessTime
EndFunc

thank you for your help

Link to comment
Share on other sites

I didn't test your code but it seems right.  But you should check how name (or any other properties) is spelled in a class.  If you had did that, you would have noticed that the ".exe" is removed from the name.  So I would always recommend having those 2 lines after an ExecQuery like :

Local $colItems = $objWMIService.ExecQuery('SELECT ' & $Prop & ' FROM ' & $Class)
  If Not IsObj($colItems) Then Exit MsgBox(0, "", "Not an object")
  If Not $colItems.count Then Exit MsgBox(0, "", "Not found")

And (very importantly when you start scripting a new class) always display a few instances of the class to see how properties are spelled...Beside that your code is clear.  just always add a few error checking, it will save you a lot of time !

Edited by Nine
Link to comment
Share on other sites

Ok i found the good WMI : Win32_Process

$strComputer = "."
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

$process = "explorer.exe"



While 1
    $StartRead = _GetProcTime($process,"r")
    $StartWrite = _GetProcTime($process,"w")
    Sleep(1000)
    $EndRead = _GetProcTime($process,"r")
    $EndWrite = _GetProcTime($process,"w")
    $TotalRead = Int(($EndRead - $StartRead) / 1000) / 1000
    $TotalWrite = Int(($EndWrite - $StartWrite) / 1000) / 1000


    ToolTip($process & @CRLF & "Read : " & $TotalRead & " Mo" & @CRLF & "Write: " & $TotalWrite & " Mo", 10, 10, "Read / Write Process per sec")
WEnd

ToolTip("")

Func _GetProcTime($sProcName,$sReadWrite)
    If Not ProcessExists($sProcName) Then Return SetError(1, 0, 0)

    Local $colProcesses, $objProcess, $sngProcessTime

    $colProcesses = $objWMIService.ExecQuery("Select * from Win32_Process Where name = '" & $sProcName & "'")

        For $objProcess in $colProcesses
            If $sReadWrite == "r" Then $sngProcessTime = $objProcess.ReadTransferCount
            If $sReadWrite == "w" Then $sngProcessTime = $objProcess.WriteTransferCount
        Next

    Return $sngProcessTime
EndFunc

it work perfect :)

Edited by jresine
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...