如何用PowerShell/CMD从文本文件中提取指定scanId值?
提取文本文件中JSON的scanId值
PowerShell 解决方案
直接解析JSON是最可靠的方式,能避免正则误匹配无关内容:
方法1:提取完整JSON块后解析
如果文件中的JSON是完整的对象(用{}包裹,单行或多行),可以先提取再解析:
# 读取整个文件内容 $fileContent = Get-Content -Path C:\Folder\scanjson.txt -Raw # 匹配完整JSON对象((?s)启用单行模式,让.匹配换行符) if ($fileContent -match '(?s)\{.*\}') { # 将匹配到的JSON字符串转为对象 $jsonObject = $matches[0] | ConvertFrom-Json # 直接输出scanId值 $jsonObject.scanId }
方法2:针对性匹配scanId行
如果JSON里scanId的格式固定(比如"scanId": 12345),可以用精准正则匹配:
Select-String -Path C:\Folder\scanjson.txt '"scanId":\s*(\d+)' | ForEach-Object { $_.Matches.Groups[1].Value }
这个正则只匹配带引号的scanId键后跟的数字,不会命中上传进度里的无关行。
CMD 解决方案
CMD没有原生JSON解析工具,只能通过字符串处理提取:
@echo off setlocal enabledelayedexpansion # 查找包含"scanId"的行,分割后提取值 for /f "tokens=2 delims=:, " %%a in ('findstr /i "\"scanId\"" C:\Folder\scanjson.txt') do ( set "scanId=%%a" # 移除可能的引号和逗号 set "scanId=!scanId:"=!" set "scanId=!scanId:,=!" echo !scanId! goto :end ) :end endlocal
问题说明
你之前的命令会匹配所有冒号后跟数字的行,上传进度里类似上传进度: 75%的内容也会被命中,所以返回无关结果。只有针对性匹配scanId键或直接解析JSON,才能准确获取目标值。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

