You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理文件中获取PC序列号命令失效,CMD中正常运行求助

批处理脚本读取BIOS序列号问题的解决

错误原因

你的脚本出现Echo is OFF的核心问题有两个:

  1. For循环参数逻辑错误:使用wmic bios get serialnumber /value时,输出格式为SerialNumber=XXX,但你设置的skip=1 tokens=2 delims=参数完全错误——delims=表示不使用任何分隔符,整行作为单个token,此时tokens=2无法获取到任何内容,导致TRACKID变量未被赋值。当执行echo %TRACKID%时,因为变量为空,CMD默认输出Echo is OFF。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:43:10