批处理过滤loginusers.txt提取MostRecent为1的用户ID
批处理过滤Steam登录用户文件方案
需求说明
我需要用批处理过滤loginusers.txt文件:如果文件中某个{ }块内存在"MostRecent" "1",就提取该块外的"76561199048621574"这类SteamID字符串,去掉引号后赋值给变量;如果"MostRecent"为"0",则忽略对应的整个{ }块。
文件内容示例:
"users" { "76561199048621574" { "AccountName" "acc1_internalname" "PersonaName" "acc1_displayname" "RememberPassword" "1" "WantsOfflineMode" "0" "SkipOfflineModeWarning" "0" "AllowAutoLogin" "1" "MostRecent" "1" "Timestamp" "1660477659" } "76561198832716662" { "AccountName" "acc2_internalname" "PersonaName" "acc2_displayname" "RememberPassword" "0" "WantsOfflineMode" "0" "SkipOfflineModeWarning" "0" "AllowAutoLogin" "0" "MostRecent" "0" "Timestamp" "1650761551" } }
批处理脚本代码
@echo off setlocal enabledelayedexpansion set "targetID=" set "currentID=" set "inUserBlock=0" set "braceLevel=0" for /f "usebackq tokens=* delims=" %%a in ("loginusers.txt") do ( set "line=%%a" :: 匹配独立的SteamID行(带引号的纯数字串) echo !line! | findstr /r /c:"^[ \t]*\"[0-9][0-9]*\"[ \t]*$" >nul if not errorlevel 1 ( set "currentID=!line!" :: 移除引号、空格和制表符 set "currentID=!currentID:"=!" set "currentID=!currentID: =!" set "currentID=!currentID: =!" set "inUserBlock=0" set "braceLevel=0" ) :: 匹配左大括号,跟踪层级 echo !line! | findstr /r /c:"^[ \t]*{[ \t]*$" >nul if not errorlevel 1 ( set /a braceLevel+=1 if !braceLevel! equ 1 ( set "inUserBlock=1" ) ) :: 匹配右大括号,退出用户块 echo !line! | findstr /r /c:"^[ \t]*}[ \t]*$" >nul if not errorlevel 1 ( set /a braceLevel-=1 if !braceLevel! equ 0 ( set "inUserBlock=0" ) ) :: 在用户块内检查MostRecent是否为1 if !inUserBlock! equ 1 ( echo !line! | findstr /r /c:"^[ \t]*\"MostRecent\"[ \t]*\"1\"[ \t]*$" >nul if not errorlevel 1 ( set "targetID=!currentID!" ) ) ) :: 输出结果并传递变量到外部环境 if defined targetID ( echo 匹配到的SteamID:!targetID! endlocal & set "STEAM_ID=%targetID%" ) else ( echo 未找到MostRecent为1的用户 endlocal & set "STEAM_ID=" )
代码说明
- 启用延迟变量扩展:
setlocal enabledelayedexpansion允许在循环内实时修改变量值,避免批处理变量替换的延迟问题。 - 跟踪SteamID:通过正则匹配提取独立的带引号数字串,清理掉引号、空格和制表符后暂存为
currentID。 - 括号层级判断:用
braceLevel变量跟踪大括号嵌套层级,确保只处理当前SteamID对应的用户配置块,避免嵌套干扰。 - 匹配MostRecent:在用户块内检查是否存在
"MostRecent" "1",匹配成功则将暂存的SteamID赋值给targetID。 - 变量传递:通过
endlocal & set "STEAM_ID=%targetID%"将结果变量传递到脚本外部环境,方便后续命令调用。
内容的提问来源于stack exchange,提问作者Nicholas Stockton
相关产品推荐
相关产品推荐

