Get-Counter 未检索到有效详细信息
Posted
技术标签:
【中文标题】Get-Counter 未检索到有效详细信息【英文标题】:Get-Counter not retrieving valid details 【发布时间】:2020-06-19 11:11:20 【问题描述】:我正在尝试使用 PowerShell 从任务管理器中检索 I/O 详细信息。下面是我现在尝试使用的脚本,并且已经取得了部分成功。
$gc = get-counter -ComputerName $($service.ServerName) "\Process($Tservicename)\IO Other Bytes/sec" -ErrorAction SilentlyContinue
$OtherBytes=$gc.CounterSamples|Select cookedvalue
这里 $serviceName & ServerName 循环通过。以下是我面临的问题。
我无法检索所有服务的 IO 其他字节详细信息,我在管理员模式下运行脚本,因此访问应该不是问题。
如果有多个进程正在执行,例如 chrome.exe 将运行多个服务,上述脚本是否会给出累积结果,它是否会提供累积值。如果不是我如何提取 chrome 的每个进程的详细信息。
-- 更新问题--
我们正在使用 Get-Counter cmdlet 来检索 IO 读取和写入字节的详细信息。这对于大多数进程返回 0,这是由于无法访问系统进程还是由于访问问题。
-- 回答--
经过一番研究,发现 cmdlet 检索到的值是基于该特定实例的,这就是为什么我们需要使用 SampleInterval 对数据进行采样的原因。但是我的要求就足够了,使用 RawValue 参数,因为我正在寻找服务器启动后的值作为累积值。
-
列表项
【问题讨论】:
【参考方案1】:这里有两件重要的事情要理解:
-
服务名称和进程名称之间没有一对一的关系
性能计数器对象实例名称不使用进程 ID(至少默认情况下)
这意味着您需要进行两个级别的实例转换才能理解计数器:
将服务转换为进程 ID - 我们可以为此使用Win32_Service
WMI 类
将进程 ID 转换为 Process
计数器实例 - 我们可以为此使用 Process(*)\ID Process
计数器值
function Get-ServiceCounter
param(
[Parameter(Mandatory = $true, Position = 0)]
[string]
$ServiceName,
[Parameter(Position = 1)]
[string]
$ValueName
[string]
$Computername = '.'
)
$ID = Get-CimInstance Win32_Service -Filter "Name = '$ServiceName'" -ComputerName $ComputerName -ErrorAction SilentlyContinue |Select -Expand ProcessID
if(-not $ID)
Write-Error "Could not resolve process for service '$ServiceName'"
return
$Instance = Get-Counter -ComputerName $ComputerName "\Process(*)\ID Process" |Where-Object CookedValue -eq $ID -ErrorAction SilentlyContinue
if(-not $Instance)
Write-Error "Could not performance counter instance for Process ID $ID"
return
Get-Counter ($InstanceName -replace '\\id process',"\$ValueName") -ComputerName $ComputerName -ErrorAction SilentlyContinue
【讨论】:
感谢您的指导,让我继续努力。与此同时,我又用一个障碍更新了这个问题。 我已经调整了您提供的代码以修复错误,但是对于大多数服务,它为计数器返回零,例如“读取字节”/“写入字节”。有什么具体的事情可以捕捉到这些以上是关于Get-Counter 未检索到有效详细信息的主要内容,如果未能解决你的问题,请参考以下文章
Django - DRF 删除/检索/补丁返回 404 详细信息:“未找到”