Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如果进程达到CPU使用率的x%,则终止该进程_Powershell - Fatal编程技术网

Powershell 如果进程达到CPU使用率的x%,则终止该进程

Powershell 如果进程达到CPU使用率的x%,则终止该进程,powershell,Powershell,我想停止CPU使用率高于14%的进程 $process = get-process foreach ($proc in (Get-WmiObject Win32_Processor)){ if($proc.numberofcores -eq $null){ $cores++ }else{ $cores = $cores + $proc.numberofcores } } foreach($name in $process){ $processName = $n

我想停止CPU使用率高于14%的进程

$process = get-process
    foreach ($proc in (Get-WmiObject  Win32_Processor)){
if($proc.numberofcores -eq $null){
    $cores++
}else{
    $cores = $cores + $proc.numberofcores
}
} 
foreach($name in $process){
    $processName = $name.processName
foreach($hog in $processName){
       $cpuusage = [Math]::round(((((Get-Counter "\Process($processName)\% 
Processor Time" -MaxSamples 2).Countersamples)[0].CookedValue)/$cores),2)

        if($cpuusage -gt 14){
            Stop-Process -Name $processName
        }
}
}
我将以下内容视为一个错误,仅此而已。我希望空闲(0)不会工作,但不会杀死其他任何东西

停止进程:无法停止进程“空闲(0)”,原因如下 错误:访问被拒绝 第14行字符:17 +停止进程-名称$processName + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:CloseError:(System.Diagnostics.Process) (空闲):进程)[停止进程],ProcessCommandException +FullyQualifiedErrorId: CouldNotStopProcess,Microsoft.PowerShell.Commands.stopprocess命令

我已经尝试将第二个foreach循环中的
$processName
变量替换为
$hog
,但仍然得到相同的错误

在阅读了@JosefZ答案后,我得到了一些满足我的课程要求的东西。张贴于此以供参考

$process = get-process
foreach ($pro in $process){
    $name = $pro.ProcessName
    $CpuCores = (Get-WmiObject -Class Win32_Processor).NumberOfCores
    $CpuValue = ((Get-Counter "\Process($name)\% Processor Time").CounterSamples.CookedValue)/$CpuCores
    $percent = [Decimal]::Round($CpuValue, 3)
        if($percent -ge 15){
        Stop-Process -Name $name
        $wshell = New-Object -ComObject Wscript.Shell
        $wshell.Popup("Process $name was using more than $percent % CPU. We have eliminated it.",0,"Ok",0x1)
    }
}
注意,和

以下脚本用于调试CPU耗时的wmic path cim_数据文件和防病毒完全扫描:

Set-StrictMode -Version latest
$process = get-process
$cores = 0
foreach ($proc in (Get-WmiObject  Win32_Processor)){
    if($proc.numberofcores -eq $null){
        $cores++
    }else{
        $cores = $cores + $proc.numberofcores
    }
} 
### $cores
foreach($name in $process){
    $processName = $name.processName
    if ( $processName -notmatch "^Idle" ) {
        foreach($hog in $processName){
            $cpuusage = -1
            $cpuusage = [Math]::round(((((Get-Counter "\Process($processName)\% Processor Time" -MaxSamples 2).Countersamples)[0].CookedValue)/$cores),2)
            if ($cpuusage -gt 14) {
                Stop-Process -Name $processName -PassThru -ErrorAction Continue
                ### "{0} {1} {2} {3}" -f '+', $cpuusage, $name.Id, $processName
            } else {
                if($cpuusage -ne 0){
                    ### "{0} {1} {2} {3}" -f '-', $cpuusage, $name.Id, $processName
                }
            }
        }
    }
}
脏解决方案
停止进程-名称$processName-错误操作SilentlyContinue-PassThru

表示“不活动”(不运行或正在使用)。当“系统空闲进程”处于
100%
时,这意味着没有任何东西在使用您的CPU资源

请阅读MSDN:

Windows PowerShell为您提供了列出进程的灵活性,但是 停止进程怎么样

Stop Process
cmdlet采用
名称
Id
来指定进程 你想停下来。您停止进程的能力取决于您的 权限某些进程无法停止。例如,如果你 尝试停止空闲进程时,会出现错误:

PS> Stop-Process -Name Idle
Stop-Process : Process 'Idle (0)' cannot be stopped due to the following error:
 Access is denied
At line:1 char:13
+ Stop-Process  <<<< -Name Idle
PS>停止进程-名称空闲
停止进程:由于以下错误,进程“空闲(0)”无法停止:
访问被拒绝
第1行字符:13

+停止进程为您提供两个额外的指针。首先,您应该使用
Win32\u计算机系统
NumberOfLogicalProcessors
而不是
Win32\u处理器
NumberOfCores
。原因是,性能计数器在具有超线程的系统上占主导地位,因此,基于物理内核的计算将为您提供一个处理器时间值,其大小是其应有大小的两倍。例如,在我有6个物理内核的机器上,由于超线程,我有12个逻辑处理器。使用您最初的计算,使用8%CPU的进程将被报告为16%,因此将被错误地停止。
Win32\u ComputerSystem
版本将返回所有物理CPU上的所有逻辑处理器,因此也将正确计算多插槽服务器

C:\WINDOWS\system32> (Get-WmiObject win32_processor).NumberofCores
6
C:\WINDOWS\system32> (Get-WmiObject win32_computersystem).Numberoflogicalprocessors
12
其次,您应该根据进程的ID而不是名称来停止进程,因为这将产生意外的后果。一个简单的例子是Chrome,它的每个选项卡都有一个进程,所有选项卡都有一个名称Chrome。因此,单个选项卡可能会出现问题,导致高CPU,但您的脚本调用
Stop Process-Name Chrome
将关闭所有Chrome实例,包括那些没有执行任何操作的实例

以下示例脚本解决了这两个问题:

#Get all cores, which includes virtual cores from hyperthreading
$cores = (Get-WmiObject  Win32_ComputerSystem).NumberOfLogicalProcessors
#Get all process with there ID's, excluding processes you can't stop.
$processes = ((Get-Counter "\Process(*)\ID Process").CounterSamples).where({$_.InstanceName -notin "idle","_total","system"})
#Get cpu time for all processes
$cputime = $processes.Path.Replace("id process", "% Processor Time") | get-counter | select -ExpandProperty CounterSamples
#Get the processes with above 14% utilisation.
$highUsage = $cputime.where({[Math]::round($_.CookedValue / $cores,2) -gt 14})
# For each high usage process, grab it's process ID from the processes list, by matching on the relevant part of the path
$highUsage |%{
    $path = $_.Path
    $id = $processes.where({$_.Path -like "*$($path.Split('(')[1].Split(')')[0])*"}) | select -ExpandProperty CookedValue
    Stop-Process -Id $id -Force -ErrorAction SilentlyContinue
}

请注意,
。的用法(
语法要求PowerShell 5或更高版本。此脚本还有一个额外的优点,即比在foreach循环中调用
Get Counter
快得多。

是的,我知道空闲意味着什么。感谢您提供的信息。不过,我仍然无法让脚本终止进程。通过您的编辑,它将在没有任何错误的情况下运行rs,但任何在任务管理器中运行超过14%的任务都不会停止。在阅读了您在编辑之前提出的建议后,我花了最后几个小时进行了反复试验。我最终得到了一些适合我需要的东西(用于学校)。我已将此标记为答案,如果不仔细阅读,我将无法得到进一步的答案。那么,您的实际解决方案是什么?您是否找到了为什么它没有按预期停止进程的原因?这是一个安全问题,还是因为瞬时测量值从未达到14%?