我希望能够每 5 秒将最高 CPU 消耗者输出到日志文件。这样我就可以在测试期间看到谁使用了最多的 cpu。
我发现这个答案很常见:
$cpu = Get-Counter -ComputerName localhost "\Process(*)\% Processor Time" `
| Select-Object -ExpandProperty countersamples `
| where {$_.InstanceName -ne 'idle' } `
| where {$_.InstanceName -ne '_total' }`
| Select-Object -Property instancename, cookedvalue `
| Sort-Object -Property cookedvalue -Descending `
| Select-Object -First 5 `
| ft @{L='Date';E={Get-Date}}, InstanceName, @{L='CPU';E={(($_.Cookedvalue/100)/$NumberOfLogicalProcessors).toString('P')}} -HideTableHeaders `
| Format-Table -Auto | Out-String
我有两个问题:
-
有时我会得到:
Get-Counter:性能计数器示例之一中的数据无效。查看每个 PerformanceCounterSample 对象的 Status 属性以确保它包含有效数据。
-
我想获得完整的进程名称,而不是
java 25%
idea64 0.8%
...
我将尝试使用以下脚本立即回答您的两个问题:
Get-Counter "\Process(*)\% Processor Time" -ErrorAction SilentlyContinue `
| select -ExpandProperty CounterSamples `
| where {$_.Status -eq 0 -and $_.instancename -notin "_total", "idle"} `
| sort CookedValue -Descending `
| select TimeStamp,
@{N="Name";E={
$friendlyName = $_.InstanceName
try {
$procId = [System.Diagnostics.Process]::GetProcessesByName($_.InstanceName)[0].Id
$proc = Get-WmiObject -Query "SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId=$procId"
$procPath = ($proc | where { $_.ExecutablePath } | select -First 1).ExecutablePath
$friendlyName = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($procPath).FileDescription
} catch { }
$friendlyName
}},
@{N="CPU";E={($_.CookedValue/100/$env:NUMBER_OF_PROCESSORS).ToString("P")}} -First 5 `
| ft -a -HideTableHeaders
结果如下表:
24.07.2016 21:00:53 Microsoft Edge Content Process 9,68%
24.07.2016 21:00:53 system 0,77%
24.07.2016 21:00:53 Microsoft Edge 0,39%
24.07.2016 21:00:53 runtimebroker 0,39%
24.07.2016 21:00:53 Host Process for Windows Services 0,39%
- 根据指定,您有时会得到:
Get-Counter :性能计数器样本之一中的数据是
无效。查看每个 PerformanceCounterSample 的 Status 属性
对象以确保它包含有效数据。
这和windows环境下的进程管理有关。当您执行查询时,一些进程可能会出现,其中一些可能会消失(即负责执行 wmi 查询的 wmiprvse 进程)。某些进程可能需要您拥有更多权限。这都会导致获取进程信息时出错。可以使用安全地跳过它-ErrorAction SilentlyContinue
开关并过滤Status -eq 0
表达。
- 您还希望看到更友好的进程名称。我不知道是否有比使用可执行文件本身更好的方法来获取该名称
GetVersionInfo
方法。如果有此类信息FileDescription
属性存储该值。如果它不可用,则使用不友好的进程名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)