本文目录导读:

获取系统分级(通常指Windows的“Windows 体验指数”或“系统性能分级”)的信息,可以使用多种脚本方法,最直接的方法是通过PowerShell查询WMI(Windows Management Instrumentation)或注册表。
以下是几种常见的方法,适用于不同的需求和环境。
使用PowerShell(推荐,最灵活)
这种方法可以直接获取每个子分数(处理器、内存、图形、游戏图形、磁盘)和基础分数。
核心命令:
# 获取Win32_WinSAT对象(如果之前运行过评估) Get-CimInstance -Namespace "root\CIMV2" -ClassName "Win32_WinSAT"
完整示例脚本(带错误处理和输出美化):
<#
.SYNOPSIS
获取并显示Windows系统性能分级(体验指数)信息。
.DESCRIPTION
此脚本读取Windows评估结果(WinSAT),并显示各个组件的评分以及基础分数。
如果系统未运行过性能评估,会给出提示。
#>
function Get-SystemPerformanceRating {
try {
# 尝试获取Win32_WinSAT实例
$winsat = Get-CimInstance -Namespace "root\CIMV2" -ClassName "Win32_WinSAT" -ErrorAction Stop
# 检查是否为有效的评估数据
if ($null -eq $winsat) {
Write-Warning "未找到系统性能评估数据,请先运行 'winsat formal' 命令来评估系统性能。"
return
}
# 定义组件名称与WMI属性的映射
$ratings = @{
"处理器" = [math]::Round($winsat.CPUScore, 1)
"内存 (RAM)" = [math]::Round($winsat.MemoryScore, 1)
"图形" = [math]::Round($winsat.GraphicsScore, 1)
"游戏图形" = [math]::Round($winsat.D3DScore, 1)
"主硬盘" = [math]::Round($winsat.DiskScore, 1)
}
# 计算基础分数(各子分数中的最小值)
$baseScore = [math]::Round($winsat.WinSPRLevel, 1)
# 输出结果
Write-Host "======= 系统性能分级信息 =======" -ForegroundColor Cyan
foreach ($component in $ratings.Keys) {
Write-Host ("{0,-20}: {1:F1}" -f $component, $ratings[$component])
}
Write-Host ("{0,-20}: {1:F1}" -f "基础分数 (WinSPR)", $baseScore) -ForegroundColor Yellow
Write-Host "================================" -ForegroundColor Cyan
# 返回对象,便于后续脚本使用
return $winsat
}
catch [Microsoft.Management.Infrastructure.CimException] {
Write-Error "无法连接到WMI,请以管理员身份运行或检查系统,错误: $($_.Exception.Message)"
}
catch {
Write-Error "发生未知错误: $($_.Exception.Message)"
}
}
# 调用函数
Get-SystemPerformanceRating
运行方式:
- 打开 PowerShell(普通权限即可)。
- 复制粘贴上述代码并执行。
使用CMD(批处理脚本,简单直接)
如果你需要一个 .bat 或 .cmd 文件,可以通过读取注册表来实现。
批处理脚本 (Get-PerformanceRating.bat):
@echo off
setlocal enabledelayedexpansion
echo ======= 系统性能分级信息 =======
echo 正在从注册表读取...
:: 读取各子分数(如果不存在则设为"N/A")
for %%a in (ProcessorScore MemoryScore GraphicsScore D3DScore DiskScore) do (
set "%%a=N/A"
for /f "tokens=3 skip=2" %%b in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinSAT" /v %%a 2^>nul') do (
set "%%a=%%b"
)
)
:: 读取基础分数(WinSPRLevel)
set "BaseScore=N/A"
for /f "tokens=3 skip=2" %%c in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinSAT" /v WinSPRLevel 2^>nul') do (
set "BaseScore=%%c"
)
:: 输出结果
echo 处理器评分: !ProcessorScore!
echo 内存评分: !MemoryScore!
echo 桌面图形评分: !GraphicsScore!
echo 游戏图形评分: !D3DScore!
echo 主硬盘评分: !DiskScore!
echo.
echo 基础分数: !BaseScore!
if "!BaseScore!"=="N/A" (
echo.
echo 注意: 未找到评估数据,请运行 'winsat formal' 以生成数据。
)
endlocal
pause
运行方式:
- 将上述代码保存为
Get-Rating.bat。 - 双击运行或通过CMD执行。
使用VBScript(旧版系统/兼容性)
VBScript同样通过WMI查询,适用于更老的脚本环境。
VBScript脚本 (GetRating.vbs):
Dim objWMIService, colItems, objItem
' 连接到WMI
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
' 查询Win32_WinSAT类
Set colItems = objWMIService.ExecQuery("Select * from Win32_WinSAT")
If colItems.Count = 0 Then
WScript.Echo "未找到性能评估数据,请先运行 'winsat formal'。"
Else
For Each objItem in colItems
WScript.Echo "处理器评分: " & Round(objItem.CPUScore, 1)
WScript.Echo "内存评分: " & Round(objItem.MemoryScore, 1)
WScript.Echo "桌面图形评分: " & Round(objItem.GraphicsScore, 1)
WScript.Echo "游戏图形评分: " & Round(objItem.D3DScore, 1)
WScript.Echo "主硬盘评分: " & Round(objItem.DiskScore, 1)
WScript.Echo "基础分数: " & Round(objItem.WinSPRLevel, 1)
Next
End If
运行方式:
- 保存为
GetRating.vbs。 - 双击运行或在CMD中执行
cscript GetRating.vbs。
重要说明
-
数据来源:
- WMI路径:
root\CIMV2\Win32_WinSAT - 注册表路径:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinSAT - 数据存储文件:
%SystemRoot%\Performance\WinSAT\DataStore\...Formal.Assessment...XML
- WMI路径:
-
权限:
- 读取数据通常不需要管理员权限,正常运行即可。
Get-CimInstance可能会因为系统策略失败,此时可以尝试使用Get-WmiObject(但Get-CimInstance是更现代、更安全的标准)。
-
数据缺失:
- 如果系统从未运行过性能评估(例如新安装的系统或精简版系统),上述脚本可能返回空值或提示“未找到”。
- 在这种情况下,你需要先运行
winsat formal来生成评估数据,这个命令需要管理员权限,并且运行时间较长(几分钟)。
-
版本差异:
- Windows 8及以上:基础分数范围是 0 到 9.9。
- Windows 7:基础分数范围是 0 到 7.9。
- Windows Vista:基础分数范围是 0 到 5.9。
- 脚本会自动显示实际的数值,你只需要根据系统版本理解其范围即可。
总结建议
- 对大多数用户和运维场景:推荐使用 PowerShell脚本(方法一),它最清晰、可扩展性强,并且能很好地处理错误。
- 对需要双击运行的简单场景:可以使用 批处理脚本(方法二)。
- 对旧系统或特定部署环境:可以使用 VBScript(方法三)。
选择适合你环境的方法即可。