我对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。