jresine Posted May 2, 2019 Posted May 2, 2019 (edited) Hello, is it possible to know via a script or command, to have the percentage of disk usage of a process? thank you in advance. ps: see image Edited May 4, 2019 by jresine
Nine Posted May 2, 2019 Posted May 2, 2019 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... “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Debug Messages Monitor UDF Screen Scraping Round Corner GUI UDF Multi-Threading Made Easy Interface Object based on Tag
jresine Posted May 4, 2019 Author Posted May 4, 2019 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
Nine Posted May 4, 2019 Posted May 4, 2019 (edited) 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 May 4, 2019 by Nine “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Debug Messages Monitor UDF Screen Scraping Round Corner GUI UDF Multi-Threading Made Easy Interface Object based on Tag
jresine Posted May 4, 2019 Author Posted May 4, 2019 (edited) 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 May 4, 2019 by jresine
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now