Powershell – 获取磁盘IO性能计数器

我对Powershell很新颖。 当一个特定的进程正在运行时,我需要获取系统的页面错误和磁盘IO。 我能够得到页面错误,但无法获得磁盘IO。 你能帮我吗? 以下是我的代码:

$arrayDIO = @() $arrayPf = @() $cmdProcess = start-process cmd -passthru while (-not $cmdProcess.HasExited) { $arrayDIO += %{ (Get-WmiObject Win32_PerfFormattedData_PerfProc_Process).IOWriteOperationsPerSec } $arrayPf += %{ (Get-WmiObject Win32_PerfFormattedData_PerfOS_memory).PageFaultsPerSec } sleep 2 } $arrayPf | Measure-Object -Average -Maximum -Minimum | Out-File -Filepath C:\Details.txt $arrayDIO | Measure-Object -Average -Maximum -Minimum | Out-File -Filepath C:\Details.txt -append 

您正在抓取性能计数器,该计数器返回每个进程的进程数据,并将所有进程组合到一个计数器(_Total)中。 您需要按进程名称进行过滤以获取特定进程的性能数据。

您没有数据的原因是因为Get-WMIObject命令返回一个ManagementBaseObject对象数组,每个对象都包含IOWriteOperationsPersec属性,但数组本身不包含该属性。 您最终会得到一个空的$arrayDIO数组,因此没有Measure-Object性能数据。

在你的例子中查看第5行的更新代码:

 $arrayDIO += % { (Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | Where-Object { $_.Name -eq "_Total"}).IOWriteOperationsPersec } 

在我把"_Total"放在哪里的时候,你可以把它replace成你想获取计数器数据的实际进程名称,或者直接保留所有进程的总计。

编辑:

要在物理磁盘写入上进行这项工作,您需要使用不同的性能计数器( http://msdn.microsoft.com/en-us/library/windows/desktop/aa394308(v=vs.85).aspx )。

试试这个:

 $arrayDIO += % { (Get-WmiObject Win32_PerfRawData_PerfDisk_PhysicalDisk | Where-Object { $_.Name -like "0*"}).DiskWriteBytesPersec /1024 } 

/1024将计数器从字节转换为MB, "0*"select磁盘ID。 如果您有多个磁盘,则需要将其更改为正确的磁盘ID。