如何在批处理变量中查找字符串?优化systeminfo信息提取
从法语版Windows 11的systeminfo提取信息(无临时文件+单次调用)
问题背景
需要提取法语版Windows 11 Enterprise的以下系统信息:
- 系统名称
- 安装日期
- 上次启动时间
- 物理内存总量
- 可用物理内存
现有方案的痛点:
- 多次调用
systeminfo导致执行缓慢 - 用
findstr一次性提取无法拆分到单独变量 - 临时文件方案可行但不想生成冗余文件
- 尝试将结果存入变量后,
find命令提示“文件未找到”,部分变量无法正常输出
尝试过的脚本
初始脚本(多次调用systeminfo,速度慢)
for /f "tokens=5,* delims= " %%a in ('systeminfo ^| find ^"Nom du syst^"') do set osname=%%a %%b for /f "tokens=4,* delims= " %%a in ('systeminfo ^| find ^"Date d'installation^"') do set osinstall=%%a %%b for /f "tokens=6,* delims= " %%a in ('systeminfo ^| find ^"Heure de d^"') do set lastboot=%%a %%b for /f "tokens=4" %%a in ('systeminfo ^| find ^"physique totale^"') do set totalmem=%%a for /f "tokens=4" %%a in ('systeminfo ^| find ^"physique disponible^"') do set freemem=%%a
findstr一次性提取(无法拆分变量)
for /f "tokens=*" %%a in ('systeminfo ^| findstr /B /C:"Nom du syst" /C:"Date d'installation" /C:"Heure de d" /C:"physique totale" /C:"physique disponible"') do @echo %%a
临时文件方案(可行但生成冗余文件)
systeminfo >systeminfo.txt
for /f "tokens=5,* delims= " %%a in ('find ^"Nom du syst^" systeminfo.txt') do set osname=%%a %%b for /f "tokens=4,* delims= " %%a in ('find ^"installation^" systeminfo.txt') do set osinstall=%%a %%b for /f "tokens=6,* delims= " %%a in ('find ^"Heure de démarrage^" systeminfo.txt') do set lastboot=%%a %%b for /f "tokens=4" %%a in ('find ^"physique totale^" systeminfo.txt') do set totalmem=%%a for /f "tokens=4" %%a in ('find ^"physique disponible^" systeminfo.txt') do set freemem=%%a
变量存储尝试(错误用法,提示文件未找到)
for /f "tokens=*" %%a in ('systeminfo ^| findstr /B /C:"Nom du syst" /C:"Date d'installation" /C:"Heure de d" /C:"physique totale" /C:"physique disponible"') do set informations=%%a
for /f "tokens=5,* delims= " %%a in ('find ^"Nom du syst^" %informations%') do set osname=%%a %%b for /f "tokens=4,* delims= " %%a in ('find ^"installation^" %informations%') do set osinstall=%%a %%b for /f "tokens=6,* delims= " %%a in ('find ^"Heure de démarrage^" %informations%') do set lastboot=%%a %%b for /f "tokens=4" %%a in ('find ^"physique totale^" %informations%') do set totalmem=%%a for /f "tokens=4" %%a in ('find ^"physique disponible^" %informations%') do set freemem=%%a
解决方案脚本
@echo off setlocal enabledelayedexpansion :: 仅调用一次systeminfo,逐行处理输出内容 for /f "delims=" %%a in ('systeminfo') do ( set "current_line=%%a" :: 匹配系统名称行并提取内容 echo !current_line! | findstr /B /C:"Nom du syst" >nul && ( for /f "tokens=5,* delims= " %%b in ("!current_line!") do set "osname=%%b %%c" ) :: 匹配安装日期行并提取内容 echo !current_line! | findstr /B /C:"Date d'installation" >nul && ( for /f "tokens=4,* delims= " %%b in ("!current_line!") do set "osinstall=%%b %%c" ) :: 匹配上次启动时间行并提取内容 echo !current_line! | findstr /B /C:"Heure de démarrage" >nul && ( for /f "tokens=6,* delims= " %%b in ("!current_line!") do set "lastboot=%%b %%c" ) :: 匹配物理内存总量行并提取内容 echo !current_line! | findstr /B /C:"Mémoire physique totale" >nul && ( for /f "tokens=4" %%b in ("!current_line!") do set "totalmem=%%b" ) :: 匹配可用物理内存行并提取内容 echo !current_line! | findstr /B /C:"Mémoire physique disponible" >nul && ( for /f "tokens=4" %%b in ("!current_line!") do set "freemem=%%b" ) ) :: 自定义排版输出提取到的信息 echo ====================== echo 系统信息提取结果 echo ====================== echo 系统名称: %osname% echo 安装日期: %osinstall% echo 上次启动时间: %lastboot% echo 物理内存总量: %totalmem% echo 可用物理内存: %freemem% endlocal
关键说明
- 单次调用systeminfo:全程仅执行一次
systeminfo,大幅提升执行速度 - 延迟变量扩展:启用
enabledelayedexpansion后,在for循环内部可以用!变量名!读取实时更新的变量值,避免循环内变量读取异常 - 避免文件引用错误:之前用
find命令传入变量内容的错误在于,find默认接收文件名而非字符串内容,这里改用echo !current_line! | findstr处理单行内容,无需临时文件 - 逐行匹配提取:对
systeminfo的每一行输出进行精准匹配,找到目标行后直接拆分字段存入对应变量,实现自定义排版需求
内容的提问来源于stack exchange,提问作者Sebastien
相关产品推荐
相关产品推荐

