如何在批处理中从WMI查询结果提取处理器型号子串
批处理提取WMI处理器型号及通用提取方法
问题背景
现有批处理通过WMI获取笔记本/台式机的处理器名称,格式示例:
Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz
需求:
- 提取中间的处理器型号(如
i7-6820HQ),型号位置不固定 - 修正现有主频提取方法的无效字符问题
- 仅用原生批处理实现,不使用PowerShell
现有代码片段:
rem proc. info setlocal enableDelayedExpansion for /f "tokens=2 delims=," %%a in ('wmic cpu get Name^ /format:csv') do ( set PRCNAM=%%a rem && echo !PRCNAM!| findstr /r /c:"!PRCNAM!" >nul && ( rem echo FOUND ) echo PRCNAM : %PRCNAM% echo PRCSPD : %PRCNAM:~-9,7% echo. )
解决方案代码
@echo off setlocal enableDelayedExpansion rem 获取处理器名称并清理无效字符 for /f "tokens=2 delims=," %%a in ('wmic cpu get Name^ /format:csv') do ( set "PRCNAM=%%a" rem 去除字符串末尾的回车符(WMI输出的常见问题) for /f "delims=" %%b in ("!PRCNAM!") do set "PRCNAM=%%b" rem 提取处理器型号:匹配iX-XXXX[后缀]格式 for /f "delims=" %%c in ('echo !PRCNAM! ^| findstr /r /c:"i[3579]-[0-9][0-9][0-9][0-9][A-Z]*"') do ( set "PRCMODEL=%%c" ) rem 提取主频:匹配@后的数字+GHz格式 for /f "delims=@ " %%d in ('echo !PRCNAM! ^| findstr /r /c:"@ [0-9.]*GHz"') do ( set "PRCSPEED=%%d" ) rem 输出结果 echo 处理器全名: !PRCNAM! echo 处理器型号: !PRCMODEL! echo 处理器主频: !PRCSPEED! echo. ) endlocal
代码说明
- 清理WMI输出无效字符:WMI的CSV输出会在字符串末尾追加回车符,通过嵌套
for /f "delims="循环可去除这些非打印字符,避免后续字符串操作出错。 - 提取处理器型号:利用
findstr的正则匹配,针对Intel酷睿系列型号规律(i3/i5/i7/i9-四位数字+可选后缀),正则表达式i[3579]-[0-9][0-9][0-9][0-9][A-Z]*可精准匹配型号部分。 - 提取主频:通过
delims=@拆分字符串,直接获取@后的主频值,避免原方法固定位置截取的局限性,同时解决无效字符问题。
批处理从WMI输出提取子字符串的通用方法
- 处理WMI输出特殊性:WMI命令输出常包含空行、回车符等无效字符,必须通过嵌套
for /f "delims="循环清理,确保字符串干净。 - 利用正则匹配(findstr):当目标子串有固定格式规律时,优先用
findstr /r的正则表达式匹配,无需依赖固定位置截取,适配更多场景。 - 延迟变量扩展(enableDelayedExpansion):在循环内修改变量后,必须用
!变量名!代替%变量名%才能读取最新值,避免变量替换提前完成。 - 字符串拆分(for /f delims/tokens):如果目标子串前后有固定分隔符(如示例中的
@、空格),可以用delims指定分隔符,直接拆分出目标内容。 - 过滤空行:在
for /f中添加skip=1(针对WMI表头)或结合findstr /v "^$"过滤空行,避免无效循环。
内容的提问来源于stack exchange,提问作者calade
相关产品推荐
相关产品推荐

