批处理文件中获取PC序列号命令失效,CMD中正常运行求助
批处理脚本读取BIOS序列号问题的解决
错误原因
你的脚本出现Echo is OFF的核心问题有两个:
- For循环参数逻辑错误:使用
wmic bios get serialnumber /value时,输出格式为SerialNumber=XXX,但你设置的skip=1 tokens=2 delims=参数完全错误——delims=表示不使用任何分隔符,整行作为单个token,此时tokens=2无法获取到任何内容,导致TRACKID变量未被赋值。当执行echo %TRACKID%时,因为变量为空,CMD默认输出Echo is OFF。 - WMIC输出编码问题:WMIC的输出是UTF-16格式,直接用for /f处理可能会残留多余的空字符,导致变量内容异常。
修正方案
针对上述问题,提供两种可行的修正方式:
方式一:修正/value模式的参数
利用delims==将SerialNumber=XXX按等号分割,直接提取等号后的序列号:
for /f "tokens=2 delims==" %%a in ('wmic bios get serialnumber /value ^| findstr /r /v "^$"') do ( set "TRACKID=%%a" goto :next )
delims==:指定等号为分隔符tokens=2:提取分隔后的第二部分内容(即序列号)^| findstr /r /v "^$":过滤WMIC输出中的空行,避免处理无效内容
方式二:直接处理普通WMIC输出
不使用/value参数,跳过标题行后提取序列号:
for /f "skip=1 tokens=* delims=" %%a in ('wmic bios get serialnumber ^| findstr /r /v "^$"') do ( set "TRACKID=%%a" goto :next )
skip=1:跳过第一行的SerialNumber标题tokens=*:提取整行内容作为序列号- 同样用
findstr过滤空行
完整修正后的脚本
@echo off setlocal enabledelayedexpansion set CURRENT_DIR=%~dp0 cd /d "%~dp0" :: 检查是否以管理员身份运行 net session >nul 2>&1 if %errorLevel% neq 0 ( echo 正在以管理员身份重新运行... powershell -Command "Start-Process '%0' -Verb RunAs" exit /b ) echo. echo 当前目录: %CD% if not exist "%CURRENT_DIR%\Tracking" ( mkdir "%CURRENT_DIR%\Tracking" ) :: 读取BIOS序列号 for /f "tokens=2 delims==" %%a in ('wmic bios get serialnumber /value ^| findstr /r /v "^$"') do ( set "TRACKID=%%a" :: 去除可能残留的空字符 set "TRACKID=!TRACKID:~0,-1!" goto :next ) :next echo !TRACKID! > "%CURRENT_DIR%\Tracking\track_id.txt" echo 序列号: !TRACKID! pause endlocal
- 添加
setlocal enabledelayedexpansion和endlocal,配合!TRACKID!处理变量延迟扩展问题,同时去除WMIC输出带来的多余空字符
内容的提问来源于stack exchange,提问作者Nour Mawla
相关产品推荐
相关产品推荐

