获取处理器 CPU 信息:批处理 / PowerShell 脚本 WMI / CIM(Windows Management Instrumentation)注册表Win32 API Windows Performance Counter 性能计数器 读取 CPU 型号、核心数、线程数、物理 CPU 个数、缓存、频率、虚拟化支持、特性集、温度、步进、插槽信息。

获取处理器 CPU 信息:批处理 / PowerShell 脚本 完整解构

分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界 目标:读取 CPU 型号、核心数、线程数、物理 CPU 个数、缓存、频率、虚拟化支持、特性集、温度、步进、插槽信息。

一、底层原理

Windows 下获取 CPU 信息有 4 条底层信息来源:

  1. WMI / CIM(Windows Management Instrumentation):最主流;内核把硬件信息导出到 WMI 仓库;脚本通过 WMI 客户端读取Win32_Processor类。
  2. 注册表:HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0;系统启动时硬件枚举阶段把 CPU 信息写入注册表;只读,重启重新填充。
  3. Win32 API:GetSystemInfo、GetLogicalProcessorInformationEx;原生 API,读取内核处理器拓扑(物理核、逻辑核、NUMA、插槽)。PowerShell 底层部分命令封装该 API。
  4. Windows Performance Counter 性能计数器:\Processor Information,读取实时频率、负载。

批处理 (wmic) 本质就是 WMI 命令行客户端;PowerShell Get‑CimInstance是新一代 WMI 实现,替代老旧 WMIC。

重要区分:

  • 型号、名称、步进、缓存:来自 BIOS / ACPI 枚举,存入 WMI / 注册表。
  • CPU 拓扑(物理 CPU、核心、超线程):内核 HAL (hal.dll) 解析 APIC 高级可编程中断控制器拓扑得到。
  • 当前运行频率:性能计数器,实时动态变化,不等于标称最大频率。

Windows 获取 CPU 信息 4 大信息来源完整解构

分析框架:底层原理|依赖文件|依赖关系|配套链|逻辑链路|边界 4 个数据源:WMI‑CIM、HKLM\HARDWARE内存注册表、Win32 处理器拓扑 API、PDH 性能计数器

一、底层原理

Windows 没有单一 “CPU 信息数据库”,4 套数据源分别来自系统启动不同阶段的硬件枚举,信息来源、更新时机、数据语义各不相同,不可互相完全替代。

  1. WMI / CIM(Win32_Processor、Win32_FeatureInfo) PNP/ACPI/hal.dll 在开机硬件枚举采集 CPU 型号、步进、插槽、缓存、虚拟化固件状态,交由 WMI 提供程序做对象封装;向上暴露 WMI 类。

WMI 不是直接读硬件寄存器;WMI 是中间抽象层,数据来源于 HAL、PNP 管理器,再加工后对外输出。

  1. 内存注册表 HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\<n> HARDWARE是运行时内存配置单元,不持久化到磁盘 hive 文件。 系统开机:PNP 总线枚举 → HAL 解析 ACPI MADT → 将 CPU 名称、厂商 ID、标识符写入该内存注册表项;关机全部销毁,每次开机重建。

仅保存基础标识字符串;不存放拓扑(核心 / 线程)、缓存大小、实时频率。

  1. Win32 API GetSystemInfo / GetLogicalProcessorInformationEx 直接内核态调用 HAL 接口,读取 APIC 高级中断控制器拓扑;返回原始处理器拓扑:物理 CPU、物理核心、逻辑处理器、NUMA 节点、处理器组、插槽关系。

这是 Windows 内部最权威拓扑来源;WMI 的 NumberOfCores/NumberOfLogicalProcessors 底层也是取自这套 API,再做封装输出。

  1. PDH 性能计数器 \Processor Information 内核 CPU 电源管理模块跟踪 CPU P‑state、C‑state、运行周期;将动态实时频率、负载、性能百分比输出到内核性能计数器;用户态通过pdh.dll读取。

只反映运行时动态状态;不含 CPU 静态规格(型号、缓存、步进)。

关键区分静态 / 动态数据

  • 静态规格(型号、步进、缓存、插槽、指令集):WMI、内存注册表、原生 CPUID 指令
  • 拓扑关系(物理 CPU、核、线程、NUMA):GetLogicalProcessorInformationEx API(权威)
  • 动态运行数据(当前频率、负载):PDH 性能计数器

二、依赖文件

数据源 涉及文件 类型 作用
WMI‑CIM wmiprvse.exe 用户态服务进程 WMI 提供程序宿主进程
  winmgmt服务 系统服务 WMI 总服务
  Microsoft.Management.Infrastructure.dll .NET 程序集 PowerShell Get‑CimInstance客户端库
  wmic.exe 可执行 老旧 WMI 命令行客户端,已弃用
  hal.dll 内核驱动 HAL 硬件抽象层,硬件信息原始来源
内存注册表 CPU 分支 reg.exe 命令行工具 读取注册表工具
  配置单元HARDWARE 内存虚拟 hive 开机由 PNP/HAL 动态生成,不落地磁盘
Win32 拓扑 API kernel32.dll 用户态 DLL 导出GetSystemInfo、GetLogicalProcessorInformationEx
  hal.dll 内核驱动 内核接口,返回处理器原始拓扑
PDH 性能计数器 pdh.dll 用户态 DLL 性能计数器查询 API
  perfdisk.dll/ 内核计数器 内核导出 CPU 运行时统计数据

三、依赖关系

1. WMI / CIM 依赖链

hal.dll(硬件枚举) → WMI提供程序 → winmgmt(wmiprvse.exe) → Get‑CimInstance / wmic.exe

  • winmgmt服务停止:WMI 类全部不可访问;
  • WMI 内部拓扑字段本质调用GetLogicalProcessorInformationEx;WMI 是对 API 结果再封装,不是原生来源;
  • BIOS ACPI MADT 表异常 → HAL 解析出错 → WMI 输出错误核心数。

2. HKLM\HARDWARE 注册表依赖链

系统启动 → PNP总线枚举 → hal.dll解析ACPI → 填充内存HARDWARE注册表分支

  • 仅开机阶段填充;运行时 CPU 热变更一般不会自动刷新该注册表;
  • 该分支完全驻留内存;磁盘上不存在对应的注册表文件;regedit 看到的是内存镜像;
  • 不提供拓扑信息,仅标识字符串。

3. Win32 拓扑 API 依赖链

kernel32.dll API → ntdll.dll → hal.dll内核接口 → ACPI/MADT APIC硬件表

  • 不需要 WMI、不需要注册表;API 可以独立获取拓扑;WMI 反而依赖这套 API;
  • 权限:普通用户即可读取处理器拓扑;
  • 若固件 MADT 表损坏,API 直接返回错误拓扑,操作系统层面无法修复。

4. PDH 性能计数器依赖链

内核CPU电源管理 → 内核性能计数器 → pdh.dll → PowerShell Get‑Counter / perfmon

  • 依赖性能计数器库完好;计数器损坏会导致读不到实时频率;
  • 与 WMI、注册表完全解耦;即使 WMI 挂掉,依然可以读取 CPU 实时负载、当前频率。

交叉依赖总结

  1. WMI 同时依赖:HAL 硬件枚举 + 部分读取内存注册表字符串 + 调用拓扑 Win32API;
  2. 内存注册表只来自 PNP+HAL;不依赖 WMI;
  3. 拓扑 API 只依赖 HAL 内核,不依赖 WMI、注册表;
  4. PDH 性能计数器来自内核运行时统计,和静态硬件规格无关。

四、配套链

4.1 WMI‑CIM 配套

  • PowerShell:Get‑CimInstance Win32_Processor、Get‑CimInstance Win32_FeatureInfo
  • 批处理:wmic cpu get
  • 系统工具:msinfo32.exe,底层调用 WMI

4.2 内存注册表配套

  • cmd:reg query "HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0"
  • regedit 手动浏览查看

只能拿 CPU 名字、VendorIdentifier,不能做核心 / 线程判断。

4.3 Win32 拓扑 API 配套

  1. 原生 C/C++ 直接调用 GetLogicalProcessorInformationEx;
  2. PowerShell 通过Add‑Type内嵌 C# 调用该 API,绕过 WMI 获取最可靠拓扑;
  3. Task 管理器、资源监视器内部使用这套 API;

优势:WMI 故障时依然可以拿到 CPU 拓扑。

4.4 PDH 性能计数器配套

  • Perfmon 图形监视器
  • PowerShell Get‑Counter '\Processor Information(*)\% Processor Performance'
  • typeperf.exe 命令行计数器采集

五、逻辑链路

链路 1:读取 CPU 信息 —— WMI‑CIM

  1. PowerShell 执行Get‑CimInstance Win32_Processor
  2. Microsoft.Management.Infrastructure.dll发起 CIM 请求到winmgmt服务
  3. WMI 提供程序内部: ① 从 hal.dll 获取硬件信息; ② 调用GetLogicalProcessorInformationEx拿到拓扑; ③ 读取内存注册表拿到 CPU 名称字符串;
  4. 组装为Win32_Processor对象实例返回;
  5. PowerShell 输出属性。

链路 2:读取 CPU 信息 —— 内存注册表

  1. reg.exe访问HKLM\HARDWARE配置单元;
  2. 操作系统内核返回内存中保存的 PNP 枚举结果;
  3. 直接输出字符串;

不经过 WMI,不经过性能计数器;无拓扑数据。

链路 3:读取 CPU 拓扑 —— Win32 API

  1. 用户态程序调用GetLogicalProcessorInformationEx(kernel32.dll)
  2. 陷入内核,调用 HAL 驱动接口
  3. HAL 读取 ACPI MADT/APIC 硬件表,返回处理器拓扑结构体(物理 CPU、核心、逻辑 CPU、NUMA)
  4. 数据返回用户态;

完全绕开 WMI、注册表。

链路 4:读取实时频率负载 —— PDH 性能计数器

  1. pdh.dll向内核查询Processor Information计数器;
  2. 内核读取 CPU 电源管理 P‑state 运行时状态;
  3. 将实时频率、负载百分比返回用户态;

只拿运行时动态数据,不访问任何静态硬件规格。

六、边界(约束、坑点、失效条件)

6.1 WMI‑CIM 边界

  1. winmgmt服务停止、WMI 仓库损坏:所有 WMI 类读取失败;
  2. PE 环境默认无 WMI;
  3. 虚拟机环境:WMI 拿到的 CPU 型号、拓扑是 Hypervisor 上报的虚拟硬件,不是物理主机真实硬件;
  4. 旧 Windows 版本Win32_Processor的NumberOfCores存在已知 Bug;此时必须使用原生 Win32 API 作为校验基准;
  5. 新指令集如 AVX‑512,Win32_FeatureInfoWMI 类不覆盖,需要 CPUID 汇编指令。

6.2 内存注册表 HKLM\HARDWARE 边界

  1. 纯内存配置单元,关机全部丢失,不能修改保存;
  2. 只有 CPU 名称、厂商 ID,没有核心数、线程、缓存、频率,不能用于拓扑判断;
  3. CPU 热插拔场景,该注册表不会自动同步刷新;
  4. 多物理 CPU,注册表会生成0,1,2…多个子项。

6.3 Win32 拓扑 API 边界

  1. API 返回结果质量完全取决于 BIOS ACPI MADT 表;固件缺陷则拓扑错误,操作系统无法修复;
  2. API 只输出拓扑关系;不返回 CPU 型号、缓存、步进;拓扑 API 只管 “有多少核,怎么组织”,不管 CPU 是什么型号;
  3. 普通用户权限即可调用,不需要管理员。

6.4 PDH 性能计数器边界

  1. 只能读取当前动态频率、负载,拿不到 CPU 静态规格;
  2. 计数器库损坏,返回空值;
  3. 虚拟机环境,CPU 实时频率往往被 Hypervisor 屏蔽,读数无意义;
  4. MaxClockSpeed标称最大频率不是来自 PDH 计数器,来自 WMI。

6.5 交叉边界(工程上最容易踩坑)

  1. 现象:WMI 读出来核心数异常;

根因:WMI 封装层 Bug,优先改用GetLogicalProcessorInformationExAPI 校验。

  1. 现象:注册表能读到 CPU 名字,但 WMI 全部为空;

根因:HAL 硬件枚举正常,但 WMI 服务 / 仓库损坏。

  1. 现象:WMI 正常,但读不到实时 CPU 频率;

根因:PDH 性能计数器损坏,和 WMI 无关。

  1. 虚拟机综合表现:
  • 内存注册表、WMI:返回虚拟化后的 CPU 标识;
  • Win32 拓扑 API:返回虚拟机内虚拟 CPU 拓扑;
  • PDH 计数器:大多无法得到真实物理 CPU 频率。

6.6 选型工程建议

采集目标 优先数据源 备选数据源
CPU 型号、步进、插槽、缓存 WMI‑CIM Win32_Processor 内存注册表(仅名称)
物理 CPU / 核心 / 线程 / NUMA 拓扑 GetLogicalProcessorInformationEx API WMI(仅作参考,旧系统存在 Bug)
指令集特性 (SSE/AVX) WMI Win32_FeatureInfo CPUID 原生汇编(完整指令集)
当前实时频率、CPU 负载 PDH 性能计数器 无

工程巡检最佳实践:拓扑不要只信任 WMI,重要服务器建议用原生 Win32 API 做二次校验。

二、依赖文件

组件 文件名 类型 作用
WMI 服务进程 wmiprvse.exe 用户态服务进程 WMI 提供程序宿主,提供 Win32_Processor 数据
CIM/WMI 客户端 (PowerShell) Microsoft.Management.Infrastructure.dll .NET 程序集 PowerShell Get‑CimInstance底层库
旧 WMI 命令行 wmic.exe 可执行程序 批处理常用 wmic,已被微软标记弃用
系统硬件抽象层 hal.dll 内核驱动 解析 CPU APIC 拓扑,输出处理器拓扑信息
注册表读取 reg.exe 命令行工具 批处理读取 HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor
性能计数器 API pdh.dll 用户态 DLL 读取 CPU 实时运行频率,负载
注册表配置单元 HARDWARE 虚拟配置单元 内存注册表 不写入磁盘,系统启动时动态生成,关机消失

注册表 HKLM\HARDWARE:内存中临时注册表,重启全部重建;不能永久写入。

三、依赖关系

  1. WMI 强依赖 Winmgmt 服务(Windows Management Instrumentation) 服务停止:wmic、Get‑CimInstance 全部报错无法读取 CPU 信息。
  2. 拓扑信息依赖 HAL 硬件抽象层 hal.dll 在系统启动阶段解析 ACPI/MADT APIC 表,识别:物理插槽、物理核心、逻辑处理器、NUMA 节点;如果 BIOS 固件 ACPI 表异常,WMI 读出核心数 / 线程数会错误。
  3. 注册表 HARDWARE 配置单元依赖硬件枚举 系统开机 PNP 枚举硬件完成之后才填充 CPU 注册表项;休眠 / 热重启会刷新;该分支不会保存到硬盘注册表文件。
  4. WMIC 弃用说明: wmic.exe 调用旧版 WMI COM 接口;Win10/11 仍然自带,但微软官方不推荐;优先使用Get‑CimInstance。
  5. 性能计数器依赖 PerfMon 服务;计数器损坏,则无法读取实时 CPU 频率。
  6. 权限依赖:
  • CPU 名称、缓存、核心数:普通用户权限即可读取。
  • 部分低级硬件特性、NUMA 完整拓扑:需要管理员权限。

四、配套链

4.1 批处理 (BAT) 常用方式

  1. wmic.exe 调用 WMI Win32_Processor
wmic cpu get Name,NumberOfCores,NumberOfLogicalProcessors,MaxClockSpeed
  1. reg.exe 读取 HARDWARE 注册表
reg query "HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0"

4.2 PowerShell 推荐脚本(Get‑CimInstance,现代替代 wmic)

# 获取处理器基础信息 WMI‑CIM
Get‑CimInstance Win32_Processor | Select‑Object `
    Name,Manufacturer,MaxClockSpeed,CurrentClockSpeed,
    NumberOfCores,NumberOfLogicalProcessors,NumberOfProcessors,
    L2CacheSize,L3CacheSize,VirtualizationFirmwareEnabled,
    SocketDesignation,Stepping

# 获取完整处理器拓扑(调用Win32API GetLogicalProcessorInformationEx)
$procInfo = Get‑CimInstance Win32_Processor | Where‑Object {$_.DeviceID}
$procInfo | Format‑List *

# 读取实时CPU频率来自性能计数器
Get‑Counter '\Processor Information(*)\% Processor Performance'

4.3 底层 Win32 API(C/C++,PowerShell 可通过 Add‑Type 调用)

GetLogicalProcessorInformationEx 获取完整 NUMA、插槽、物理 / 逻辑核映射;

WMI Win32_Processor 部分老旧 Windows 版本拓扑字段有 bug,最精准拓扑来自这套原生 API。

4.4 运维配套工具

  • msinfo32.exe:系统信息,内部调用 WMI
  • wmic cpu:旧命令行
  • TaskMgr 任务管理器:读取 HAL 拓扑 + 性能计数器

五、逻辑链路

链路 A:WMI / Get‑CimInstance(PowerShell 主流路径)

  1. PowerShell 调用Get‑CimInstance Win32_Processor,调用Microsoft.Management.Infrastructure.dll
  2. 请求转发到系统服务 winmgmt(wmiprvse.exe)WMI 提供程序
  3. WMI 内部调用 HAL hal.dll 接口,读取 CPU 拓扑、硬件 ID;同时读取内存注册表 HARDWARE 分支
  4. WMI 组装成Win32_Processor对象返回给 PowerShell
  5. PowerShell 格式化输出对象属性。

链路 B:批处理 wmic.exe

  1. 批处理运行 wmic.exe;wmic 调用旧版 WMI COM 接口;
  2. 同样接入 winmgmt 服务,获取 Win32_Processor 实例;
  3. wmic 格式化文本输出到控制台。

链路 C:reg.exe 读取注册表获取 CPU 信息

  1. reg.exe 访问 HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\x
  2. HARDWARE 配置单元驻留内存,hal.dll+PNP 管理器在系统启动阶段填充;不是磁盘上的 registry hive
  3. reg 直接读出字符串输出。

⚠️注意:注册表这里只保存基础名字、标识符;拓扑(核心 / 线程数)注册表不提供,拓扑只能来自 HAL/WMI/API。

链路 D:读取实时 CPU 频率(性能计数器路径)

  1. PowerShell Get‑Counter 调用 pdh.dll
  2. pdh.dll 读取内核性能计数器,内核跟踪 CPU P‑state 功耗状态,得到当前实际运行频率。

MaxClockSpeed(标称最大频率)来自 WMI;CurrentClockSpeed 实时频率来自性能计数器。

六、边界(限制、坑点、失效条件)

1 WMI 相关边界

  1. Winmgmt服务停止 / 损坏 → wmic、Get‑CimInstance 全部失效。
  2. 部分精简版系统、PE 系统 WMI 被裁剪,无法读取 CPU 信息。
  3. 虚拟机环境:WMI 返回的 CPU 型号是虚拟机 Hypervisor 报告的,不是物理主机真实 CPU。
  4. 部分老旧 Windows Server,Win32_Processor的NumberOfCores存在已知 Bug,物理核心数读取错误;此时要靠GetLogicalProcessorInformationEx原生 API 获取准确拓扑。

2 注册表 HARDWARE 边界

  1. HKLM\HARDWARE是内存临时注册表,关机全部丢失;修改这里没有任何持久效果。
  2. 注册表只存 CPU 名称、VendorIdentifier、Identifier;没有核心、线程、缓存拓扑数据,不能用来判断超线程。

3 频率字段常见误区

  • MaxClockSpeed:WMI 读取的 CPU 标称最大 MHz,固定值。
  • CurrentClockSpeed:实时运行频率,受功耗、负载、节能策略动态变化;空闲时会远低于 MaxClockSpeed。

不要拿 CurrentClockSpeed 判断 CPU 规格,只能看实时状态。

4 虚拟化字段边界

VirtualizationFirmwareEnabled:代表固件 BIOS 是否开启虚拟化;不等于当前系统是否启用 Hyper‑V/WSL2。

5 WMIC 弃用边界

wmic.exe 在新版本 Windows 虽然还在,但微软标记为已弃用;未来版本可能移除;脚本开发优先Get‑CimInstance。

6 权限边界

  • 普通用户可读:CPU 名称、缓存、核心数、最大频率。
  • 部分 NUMA、高级处理器关系,需要管理员权限。

7 BIOS / 固件异常边界

BIOS ACPI MADT 表错误,HAL 解析拓扑出错,WMI 输出错误的核心 / 线程数;属于固件层面问题,操作系统脚本无法修复。

8 多物理 CPU 插槽边界

多 CPU 主板,Win32_Processor会返回多条实例,每一条对应一个物理插槽 CPU;脚本循环遍历全部实例,不要只读取第 0 号。

9 PE 环境边界

Windows PE 预安装环境:HAL 可用,但 WMI 默认未加载;只能通过 reg 读取 CPU 名称,无法读取 WMI 拓扑。

典型故障清单

  1. wmic cpu 返回空白:Winmgmt WMI 服务异常。
  2. 核心数读取错误:BIOS MADT APIC 表缺陷;旧系统 WMI 类 Bug。
  3. CurrentClockSpeed 数值很低:CPU 进入节能降频,不是故障。
  4. 虚拟机下 CPU 型号与物理机不一致:Hypervisor 向虚拟机上报虚拟 CPU 标识符。

完整可直接使用脚本示例

1)PowerShell 完整脚本(CIM,推荐)

# 获取完整CPU信息
$cpus = Get-CimInstance Win32_Processor
foreach($cpu in $cpus)
{
    Write‑Host "==== CPU插槽:$($cpu.SocketDesignation) ===="
    Write‑Host "型号: $($cpu.Name)"
    Write‑Host "厂商: $($cpu.Manufacturer)"
    Write‑Host "标称最大频率(MHz): $($cpu.MaxClockSpeed)"
    Write‑Host "当前运行频率(MHz): $($cpu.CurrentClockSpeed)"
    Write‑Host "物理核心数: $($cpu.NumberOfCores)"
    Write‑Host "逻辑线程数: $($cpu.NumberOfLogicalProcessors)"
    Write‑Host "L2缓存 KB: $($cpu.L2CacheSize)"
    Write‑Host "L3缓存 KB: $($cpu.L3CacheSize)"
    Write‑Host "固件虚拟化开启: $($cpu.VirtualizationFirmwareEnabled)"
}

2)批处理 BAT 脚本(兼容旧系统)

@echo off
echo === CPU信息(WMI wmic) ===
wmic cpu get Name,Manufacturer,MaxClockSpeed,CurrentClockSpeed,NumberOfCores,NumberOfLogicalProcessors,SocketDesignation
echo.
echo === 读取注册表CPU名称 ===
reg query "HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0" /v ProcessorNameString
pause

PowerShell 完整实例代码:CPU 全量信息采集

采集项:CPU 型号、厂商、步进、插槽、物理 CPU 个数、物理核心、逻辑线程、各级缓存、标称 / 实时频率、固件虚拟化支持、CPU 特性集、CPU 温度 说明:

  1. 温度依赖主板 BIOS/WMI 传感器;虚拟机一般拿不到温度;部分精简主板无传感器数据返回$null
  2. Win32_Processor不直接输出 CPU 指令集特性,指令集通过Get‑CimInstance Win32_FeatureInfo获取
  3. 物理 CPU 个数 = 返回Win32_Processor实例总数量
  4. 需要管理员权限,部分硬件传感器、特性集需要提升权限
<#
.SYNOPSIS
CPU完整信息采集脚本
采集字段:型号、步进、插槽、物理CPU数、物理核、逻辑线程、缓存、频率、虚拟化、指令集特性、CPU温度
#>

#region 1.基础CPU信息 Win32_Processor
$cpuList = Get‑CimInstance Win32_Processor
$physicalCpuCount = ($cpuList | Measure‑Object).Count
Write‑Host "`n==================== 全局概览 ===================="
Write‑Host "物理CPU插槽总数:$physicalCpuCount`n"

# 读取CPU指令集/特性集
$cpuFeatures = Get‑CimInstance Win32_FeatureInfo

# 读取硬件传感器(CPU温度,来自WMI Win32_PerfFormattedData_Counters_ThermalZoneInformation)
$thermalInfo = Get‑CimInstance Win32_PerfFormattedData_Counters_ThermalZoneInformation -ErrorAction SilentlyContinue

foreach ($cpu in $cpuList)
{
    Write‑Host "`n=================================================="
    Write‑Host "【CPU插槽】: $($cpu.SocketDesignation)"
    Write‑Host "型号        : $($cpu.Name?.Trim())"
    Write‑Host "制造商      : $($cpu.Manufacturer?.Trim())"
    Write‑Host "步进(Stepping): $($cpu.Stepping)"
    Write‑Host "设备ID      : $($cpu.DeviceID)"
    Write‑Host "标称最大频率(MHz) : $($cpu.MaxClockSpeed)"
    Write‑Host "当前实时频率(MHz) : $($cpu.CurrentClockSpeed)"
    Write‑Host "物理核心数  : $($cpu.NumberOfCores)"
    Write‑Host "逻辑线程数  : $($cpu.NumberOfLogicalProcessors)"
    Write‑Host "L1缓存(KB)  : $($cpu.L1CacheSize)"
    Write‑Host "L2缓存(KB)  : $($cpu.L2CacheSize)"
    Write‑Host "L3缓存(KB)  : $($cpu.L3CacheSize)"
    Write‑Host "固件虚拟化开启 : $($cpu.VirtualizationFirmwareEnabled)"

    # 当前CPU对应指令集特性过滤
    $thisCpuFeature = $cpuFeatures | Where‑Object {$_.DeviceID -eq $cpu.DeviceID}
    Write‑Host "`n----- CPU指令集特性集 -----"
    if($thisCpuFeature)
    {
        Write‑Host "MMX     : $($thisCpuFeature.MMX)"
        Write‑Host "SSE     : $($thisCpuFeature.SSE)"
        Write‑Host "SSE2    : $($thisCpuFeature.SSE2)"
        Write‑Host "SSE3    : $($thisCpuFeature.SSE3)"
        Write‑Host "SSE41   : $($thisCpuFeature.SSE41)"
        Write‑Host "SSE42   : $($thisCpuFeature.SSE42)"
        Write‑Host "AVX     : $($thisCpuFeature.AVX)"
        Write‑Host "AVX2    : $($thisCpuFeature.AVX2)"
        Write‑Host "NX保护  : $($thisCpuFeature.DEP)"
        Write‑Host "HyperThreading : $($thisCpuFeature.HyperThreading)"
    }
    else
    {
        Write‑Host "无法读取该CPU指令集特性"
    }
}

#region CPU温度读取
Write‑Host "`n=================================================="
Write‑Host "----- CPU温度信息 -----"
if($thermalInfo)
{
    foreach($zone in $thermalInfo)
    {
        # 单位:0.1摄氏度,做换算
        $tempC = $zone.Temperature / 10
        Write‑Host "热区名称:$($zone.Name)  温度: $tempC ℃"
    }
}
else
{
    Write‑Host "警告:无法读取CPU温度,可能原因:虚拟机 / 主板无传感器 / WMI传感器提供程序缺失"
}
#endregion

Write‑Host "`n采集完成"

BAT 批处理版本(能力受限说明)

⚠️批处理wmic无法读取指令集特性集、CPU 温度,只能读取基础硬件规格;仅适合简易巡检

@echo off
chcp 65001 >nul
echo ==================== CPU基础信息(BAT wmic) ====================
wmic cpu get Name,Manufacturer,Stepping,SocketDesignation,MaxClockSpeed,CurrentClockSpeed,NumberOfCores,NumberOfLogicalProcessors,L1CacheSize,L2CacheSize,L3CacheSize,VirtualizationFirmwareEnabled
echo.
echo 注意:bat版本不支持读取:CPU温度、指令集特性集,建议使用PowerShell完整脚本
pause

边界说明(实例代码约束)

  1. CPU 温度边界
    • 虚拟机环境:Win32_PerfFormattedData_Counters_ThermalZoneInformation返回空,无温度;
    • 部分 OEM 精简主板不导出热区传感器 WMI 数据;
    • 单位:WMI 原始单位是 0.1℃,脚本已经做除法换算为摄氏度。
  2. 指令集特性 Win32_FeatureInfo 边界
    • 旧 Windows Server 2008 及更早部分字段缺失;
    • 部分新指令集 AVX‑512 不在该 WMI 类,该 WMI 类只包含经典 SSE/AVX1/AVX2;
    • 如需完整 CPUID 原始寄存器信息,需要调用 C# 内嵌CPUID汇编指令。
  3. 虚拟化字段边界VirtualizationFirmwareEnabled = BIOS 开启虚拟化;不等于系统正在运行 Hyper‑V/WSL2。
  4. 多物理 CPU 场景 脚本自动遍历全部Win32_Processor实例,$physicalCpuCount为物理 CPU 插槽数量。
  5. 权限边界 建议以管理员 PowerShell 运行;普通用户部分传感器、特性集字段返回空。
  6. PE 环境边界 PE 下 WMI 未初始化,脚本无法执行,仅 bat 的 reg 读取 CPU 名称可用。

扩展:如果需要读取原生 CPUID 寄存器(获取全部 CPUID 特性)

PowerShell 可以内嵌 C# 调用 CPUID 汇编指令,获取完整的厂商、系列、型号、步进、全部扩展指令集(AVX512 等)。 如果你需要,我可以提供该内嵌代码片段。

输出样例片段参考

==================== 全局概览 ====================
物理CPU插槽总数:1

==================================================
【CPU插槽】: SOCKET 0
型号        : Intel(R) Core(TM) i7‑12700H
制造商      : GenuineIntel
步进(Stepping): 9
设备ID      : CPU0
标称最大频率(MHz) : 2300
当前实时频率(MHz) : 1800
物理核心数  : 14
逻辑线程数  : 20
L1缓存(KB)  : 448
L2缓存(KB)  : 17920
L3缓存(KB)  : 24576
固件虚拟化开启 : True

----- CPU指令集特性集 -----
MMX     : True
SSE     : True
SSE2    : True
……

PowerShell 脚本:

Get-WmiObject -Class Win32_Processor

默认是

横向布局(属性名称在左侧)

属性名称 值
处理器描述 (Caption) Intel64 Family 
设备ID (DeviceID) CPU0
制造商 (Manufacturer) GenuineIntel
最大时钟频率 (MaxClockSpeed) 1512 MHz
处理器名称 (Name) Intel(R) Core(TM)  CPU @ GHz
插槽规格 (SocketDesignation) U3E1

表格2:纵向布局(属性名称在上方)

属性名称
(Property Name)
处理器描述
(Caption)
设备ID
(DeviceID)
制造商
(Manufacturer)
最大时钟频率
(MaxClockSpeed)
处理器名称
(Name)
插槽规格
(SocketDesignation)
值
(Value)
Intel64 Family  CPU0 GenuineIntel 1512 MHz Intel(R) Core(TM)   CPU @ GHz U3E1

 


PowerShell 脚本或批处理脚本来获取与处理器相关的信息。以下是一些脚本:

PowerShell 脚本:

Get-WmiObject -Class Win32_Processor | Select-Object Name, NumberOfCores, NumberOfLogicalProcessors

处理器名称 (Processor Name) 物理核心数 (Number of Cores) 逻辑处理器数 (Number of Logical Processors)
Intel(R) Core(TM) xxxxx 2 4


批处理脚本:

wmic cpu get Name, NumberOfCores, NumberOfLogicalProcessors
这些脚本将提供有关 CPU 的信息,包括核心数量和逻辑处理器数量。您可以使用这些信息了解系统的硬件配置,并了解是否支持大核小核调度。


 Get-Counter 命令输出展示了系统中各个处理器核心的实时使用情况。我已经将这些数据整理成纵向布局的表格,方便您查阅。

处理器时间使用情况

PS C:\Users\Administrator> Get-Counter -Counter "\Processor(*)\% Processor Time"

处理器时间使用监控表

 
 
时间戳 (Timestamp) 计数器路径 (Counter Path) 处理器时间 (%)
2xx5-11-11 星期三 16:03:14 \\win- 3\processor(0)% processor time 8.14
2xx5-11-11 星期三 16:03:14 \\win- 3\processor(1)% processor time 0.35
2xxx5-11-11 星期三 16:03:14 \\win- 3\processor(2)% processor time 8.14
2xxx5-11-11 星期三 16:03:14 \\win- 3\processor(3)% processor time 8.14
2xx5-11-11 星期三 16:03:14 \\win- 3\processor(_total)% processor time 6.19

Timestamp                  CounterSamples
---------                  --------------
2005-11-11 星期三 16:03:14 \\win- \processor(0)\% processor time :
                           8.13926699942963

                           \\win- 3\processor(1)\% processor time :
                           0.354459118025363

                           \\win- 3\processor(2)\% processor time :
                           8.13926699942963

                           \\win- 3\processor(3)\% processor time :
                           8.13926699942963

                           \\win- \processor(_total)\% processor time :
                           6.19307001135561

 
属性 (Property) 值 (Value)
时间戳 (Timestamp) 2025-10-01 星期三 16:03:14
实例 0 CPU 时间
(Processor(0) % Processor Time)
8.14%
实例 1 CPU 时间
(Processor(1) % Processor Time)
0.35%
实例 2 CPU 时间
(Processor(2) % Processor Time)
8.14%
实例 3 CPU 时间
(Processor(3) % Processor Time)
8.14%
总 CPU 时间
(Processor(_Total) % Processor Time)
6.19%

信息解读与建议

  • 核心负载不均衡:从数据看,实例0、2、3的负载相近(约8.14%),而实例1的负载极低(0.35%)。这可能意味着当前任务未能均匀分配到所有CPU核心。

  • 监控准确性:有用户报告Get-Counter的读数与其他工具(如任务管理器)可能存在差异。为了获得更稳定的平均值,您可以在命令中增加 -MaxSamples 和 -SampleInterval 参数,例如:

    powershell
    Get-Counter -Counter "\Processor(*)\% Processor Time" -MaxSamples 3 -SampleInterval 2
  • 命令探索:您可以使用 Get-Counter -ListSet * 命令来探索系统上所有可用的性能计数器集合,从而监控更多系统指标,如内存、磁盘和网络。


希望这个表格和解读能帮助您更好地了解系统状态。

posted @ 2023-10-30 08:05  suv789  阅读(199)  评论(0)    收藏  举报