2017-07-13 16 views
1

我的脚本监视进程的CPU使用情况,每5秒循环一次并将其写入文件。哪些工作正常。当进程更改并且在进程结束时抛出错误时,Get-Counter进程不刷新

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

此外,如果一个进程结束/停止,脚本给出这个错误:

Get-Counter : The data in one of the performance counter samples is not valid. View the Status property for each PerformanceCounterSample object to make sure it contains valid data.

At line:2 char:34

看来PowerShell中只有一次检索过程信息并将其缓存。

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

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

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

如果我停止任何进程它会给出上述相同的错误。

任何想法如何解决这个问题,并强制PowerShell重新读取进程列表,而无需重新启动脚本?

+0

执行后每次重新启动它(只是一个修复,可能不是最好的解决方案).Main(){哪个调用Main作为最后一步。}这可能会诀窍 –

+0

通过这样做,您可以开始执行完整的脚本 –

+0

我如何从代码重新启动它? – user93865

回答

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 
} 
+0

这可以工作。现在我有另一个问题。我把我的代码放在一个ps1文件中。并冠以任务来运行我的代码。代码工作正常,但它只运行一次。然后它继续运行,但没有输出。如果我停止任务并再次运行,它只会再次运行一次。如果我从命令运行它可以正常工作。我如何追踪问题 – user93865

+0

好消息。我建议你为你的新问题开一个新的问题,因为那样会获得更多的知名度。如果这个答案有帮助,请考虑将其标记为已接受。 –