You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于Win32_Process的WMI优先级与SetPriority参数映射及脚本获取的问询

当然没问题!这两类优先级不仅可以明确映射,还能直接通过脚本获取SetPriority方法用的那组优先级标识,下面给你详细说明:

一、两类优先级的映射关系

首先得理清:Win32_Process查询返回的Priority进程的基础优先级值(0-31),而SetPriority用的是优先级类标识,这俩是层级对应关系——一个优先级类对应一个基础优先级的范围,具体对应如下:

  • Idle(标识64):对应基础优先级0-4
  • Below Normal(标识16384):对应基础优先级5-9
  • Normal(标识32):对应基础优先级10-14(系统默认的优先级类)
  • Above Normal(标识32768):对应基础优先级15-19
  • High Priority(标识128):对应基础优先级20-23
  • Realtime(标识256):对应基础优先级24-31

补充下:基础优先级是「优先级类 + 线程相对优先级」的结果,所以同一个优先级类下的进程/线程,基础优先级会有小范围波动,比如Normal类的进程,基础优先级可能是10到14之间的某个值。

二、直接通过脚本获取SetPriority对应的优先级标识

其实不用手动映射,Win32_Process本身就有一个PriorityClass属性,直接返回的就是SetPriority方法用的那组数值!下面给你两个常用脚本的例子:

PowerShell示例

# 替换成你要查询的进程名,比如notepad.exe
$targetProcessName = "notepad.exe"

# 获取进程对象
$process = Get-WmiObject Win32_Process -Filter "Name='$targetProcessName'"

if ($process) {
    Write-Host "进程名: $targetProcessName"
    Write-Host "优先级类标识: $($process.PriorityClass)"
    
    # 映射为可读名称
    $priorityMap = @{
        64 = "Idle"
        16384 = "Below Normal"
        32 = "Normal"
        32768 = "Above Normal"
        128 = "High Priority"
        256 = "Realtime"
    }
    Write-Host "对应优先级名称: $($priorityMap[$process.PriorityClass])"
} else {
    Write-Host "未找到进程: $targetProcessName"
}

VBScript示例

strComputer = "."
targetProcessName = "notepad.exe" ' 替换目标进程名

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Process WHERE Name='" & targetProcessName & "'" _
)

If colProcesses.Count = 0 Then
    Wscript.Echo "未找到进程: " & targetProcessName
Else
    For Each objProcess in colProcesses
        Wscript.Echo "进程ID: " & objProcess.ProcessId
        Wscript.Echo "优先级类标识: " & objProcess.PriorityClass
        Select Case objProcess.PriorityClass
            Case 64: Wscript.Echo "对应名称: Idle"
            Case 16384: Wscript.Echo "对应名称: Below Normal"
            Case 32: Wscript.Echo "对应名称: Normal"
            Case 32768: Wscript.Echo "对应名称: Above Normal"
            Case 128: Wscript.Echo "对应名称: High Priority"
            Case 256: Wscript.Echo "对应名称: Realtime"
        End Select
    Next
End If

用这两个脚本就能直接拿到SetPriority方法需要的优先级标识,比手动映射基础优先级要准确得多。

内容的提问来源于stack exchange,提问作者Hisham Thorakkal

火山引擎 最新活动