通过Get-Counter获取进程不会在进程更改时刷新,并在进程结束时抛出错误

时间:2017-07-13 08:15:46

标签: powershell

我的脚本监视进程的CPU使用情况,每5秒循环一次代码并将其写入文件。哪个工作正常。

但我发现当一个新进程运行时,我的脚本将无法找到它,直到我停止脚本并重新运行它。

此外,如果进程结束/停止,脚本会出现此错误:

  

获取计数器:其中一个性能计数器样本中的数据是   无效。查看每个的Status属性   PerformanceCounterSample对象,以确保它包含有效数据。

     

在第2行:34:

PowerShell似乎只检索一次Process信息并缓存它。

如果我运行波纹管脚本(这是我所有脚本的一部分),它运行完美:

while($true) {
     $ProcessId = (Get-Counter "\Process(*)\ID Process").CounterSamples
     $ProcessId.count
     Start-Sleep -s 5
}

如果我有50个进程,它将给出50,但如果一个新进程启动它将继续给50,直到我重新启动脚本。

如果我停止任何过程,它将在上面给出相同的错误。

知道如何解决此问题并强制PowerShell重新启动进程列表而不重新启动脚本吗?

1 个答案:

答案 0 :(得分:1)

您可以使用PowerShell作业在每次迭代的新后台进程中执行它,并使用-ErrorAction SilentlyContinue来抑制在检查过程中停止一个或多个进程时可能出现的错误消息:

while($true) {
    $ProcessId = Start-Job -ScriptBlock { (Get-Counter "\Process(*)\ID Process" -ErrorAction SilentlyContinue).CounterSamples } | Wait-Job | Receive-Job
    $ProcessId.Count
    Start-Sleep -Seconds 5
}