There are public articles on the topic and that formula, is how the default display is achieved not what you use to format later.
Have you read the MSDN docs or other WMI docs on these properties and what they mean?
‘msdn.microsoft.com/en-us/library/aa394308(v=vs.85).aspx’
AvgDisksecPerRead
Avg. Disk sec/Read is the average time, in seconds, of a read of data from the disk.
AvgDisksecPerRead_Base
AvgDisksecPerWrite
Avg. Disk sec/Write is the average time, in seconds, of a write of data to the disk.
AvgDisksecPerWrite_Base
There are native built-in formatting that PoSH provides…
‘Use PowerShell and Conditional Formatting to Format Numbers - Scripting Blog’
…but you can you normal math to construct your own.
See these articles:
‘computerperformance.co.uk/powershell/powershell_perfmon.htm’
‘Use Performance Counter Sets and PowerShell to Ease Baselining - Scripting Blog’
For example, looking at MSDN data, the value is returned as a integer and based on notes from a few years ago.
Performing base math by property and value could look something like this.
AvgDiskSecPerWrite Data type: uint32 Access type:
Read-only Qualifiers:
CookingType (“PERF_AVERAGE_TIMER”) , Counter (“AvgDiskSecPerWrite”) ,
PerfTimeStamp (“Timestamp_PerfTime”) , PerfTimeFreq (“Frequency_PerfTime”) ,
Base (“AvgDisksecPerWrite_Base”)
Average time, in seconds, of a write operation of data to the disk.
“Displaying AvgDisksecPerRead dataset `n”
Get-WmiObject Win32_PerfRawData_PerfDisk_PhysicalDisk -Filter "Not Name LIKE 'Total’" |
ForEach-Object { $PerfResultRead = ((($.AvgDisksecPerRead/$.Frequency_PerfTime)/$.AvgDisksecPerRead_Base)*1000)
“$_.name : $PerfResultRead”}
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“2 E:”.name : 0.438804798083772
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“3 H:”.name : 0.134188784331138
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“0 C:”.name : 0.962139882477829
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“1 D:”.name : 0.145717256624343
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“4 G:”.name : 0.00291737944932275
“Displaying AvgDisksecPerWrite dataset `n”
Get-WmiObject Win32_PerfRawData_PerfDisk_PhysicalDisk -Filter "Not Name LIKE 'Total’" |
ForEach-Object { $PerfResultWrite = ((($.AvgDisksecPerWrite/$.Frequency_PerfTime)/$.AvgDisksecPerWrite_Base)*1000)
“$_.name : $PerfResultWrite”}
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“2 E:”.name : 0.382004014543939
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“3 H:”.name : 0.943027217954768
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“0 C:”.name : 2.0135973250406
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“1 D:”.name : 2.54080022055718
\WS01\root\cimv2:Win32_PerfRawData_PerfDisk_PhysicalDisk.Name=“4 G:”.name : 2.54080022055718
Anyway, I hope this gets you closer to whatever your use case is.
Lastly, the above may be the long way around the cart. So, I’d suggest you take a look at the Get-Counter cmdlet.
Get-Help -Name Get-Counter -Full
Notes regarding Disk Metrics:
Property Name Command
PercentFreeSpace Get-Counter -Counter “\LogicalDisk()% Free Space"
PercentIdleTime Get-Counter -Counter "\LogicalDisk()% Idle Time”
AvgDisksecPerRead Get-Counter -Counter “\LogicalDisk()\Avg. Disk sec/Read"
AvgDisksecPerWrite Get-Counter -Counter "\LogicalDisk()\Avg. Disk sec/Write”
AvgDiskQueueLength Get-Counter -Counter “\LogicalDisk()\Avg. Disk Queue Length"
DiskTransfersPersec Get-Counter -Counter "\LogicalDisk()\Disk Transfers/sec”
CacheBytes Get-Counter -Counter “\Memory\Cache Bytes”