关于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




