Batch file 批处理文件:在子字符串出现后分析字符串,而不是delimeter

Batch file 批处理文件:在子字符串出现后分析字符串,而不是delimeter,batch-file,substring,adb,cmd,Batch File,Substring,Adb,Cmd,我有一个批处理文件脚本,它显示了adb实用程序的输出 FOR /F "skip=1 delims=~" %%x IN ('adb devices -l') DO echo %%x 2条输出线 0123456789ABCDEF device product:java_joyplus_qb7 model:TM702B4_3G device:java_joyplus_qb7 transport_id:12 F9NPFP084096 device product:WW_

我有一个批处理文件脚本,它显示了adb实用程序的输出

FOR /F "skip=1 delims=~" %%x IN ('adb devices -l') DO echo %%x
2条输出线

0123456789ABCDEF       device product:java_joyplus_qb7 model:TM702B4_3G device:java_joyplus_qb7 transport_id:12
F9NPFP084096           device product:WW_P023 model:P023 device:P023_1 transport_id:11
我想在“transport\u id:”之后解析非空格子字符串。
第一行是12,第二行是11。我怎样才能做到这一点?

如果我正确理解了您的要求,下面应该会输出您需要的信息

@Echo关闭
对于('adb.exe devices-l')Do中的/F“Skip=1 Tokens=1*”%%G(设置“DI=%%H”
SetLocal EnableDelayedExpansion
对于(“!DI:*传输id:=!”)中的/F%%I,执行EndLocal和Echo%%I)
暂停
如果您想从以下位置执行此操作:

For/F“Skip=1Tokens=1*”%G In('adb.exe devices-l')Do@Set“DI=%H”&For/F%I In('Cmd/D/V/C Echo“!DI:*transport_id:=!”)Do@Echo=%I
您可以轻松提取所有变量,无论其位置如何,并显示所需内容:

@echo off
setlocal EnableDelayedExpansion

FOR /F "skip=1 delims=" %%a IN ('adb devices -l') DO (
   for %%b in (%%a) do for /F "tokens=1,2 delims=:" %%x in ("%%b") do set "%%x=%%y"

   echo Product=!product!
   echo Transport=!transport_id!
)
例如:

Product=java_joyplus_qb7
Transport=12
Product=WW_P023
Transport=11
使用以下带有硬编码假设的
adb
输出的脚本进行测试(未安装
adb
):

输出
D:\bat\SO\61588773.bat


通常,当字符串由
分隔时,您希望获取最后一个标记。如果是这种情况(如果不是,请纠正我),这已经包含在非最后一个标记中。如果adb将更改输出格式,它可能是最后一个、第一个、第二个或倒数第二个令牌。您尝试了什么,卡在哪里?例如,您可以将子字符串替换为其他任何地方都不能出现的字符,然后您已经为/F获得了一个分隔符。如果所需的标记是“非最后一个标记。如果adb将更改输出格式,则可能是最后一个、第一个、第二个或倒数第二个标记”,则此方法将失败。在这种情况下,返回的值包括它后面的字符串…@Aacini,我不确定你的意思。例如,如果线路为:
0123456789ABCDEF设备产品:java_joyplus_qb7型号:TM702B4_3G设备:java_joyplus_qb7 transport_id:12
,或
0123456789ABCDEF设备产品:java_joyplus_qb7 transport_id:12型号:TM702B4_3G设备:java_joyplus_qb7
,则应能正常工作,或
0123456789ABCDEF设备传输id:12产品:java_joyplus_qb7型号:TM702B4_3G设备:java_joyplus_qb7
。当然,抓取每件物品的方法都有,但问题是只抓取运输ID。
SETLOCAL EnableDelayedExpansion
REM … 
FOR /F "skip=1 delims=~" %%x IN ('adb devices -l') DO (
    set "_ID="&set "_transport_id="
    call :parse "" "%%~x"
    echo transport_id !_transport_id!  (!_ID!^)
)

REM … remaining part of your script here …

goto :eof

:parse
if "%~2"=="" goto :eof 
for /F "tokens=1,*" %%G in ("%~2") do (
  if "%~1"=="" (
    set "_ID=%%~G"
    call :parse "%%~G" "%%~H" 
  ) else (
    for /F "tokens=1,2 delims=: " %%g in ("%~2") do (
      if /I "%%~g"=="transport_id" (
        set "_transport_id=%%~h"
      ) else (
        call :parse "%%~G" "%%~H" 
      )
    )
  )  
)
goto :eof
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
(
REM last token
set "_ID="&set "_transport_id="
call :parse "" "0123456789ABCDEF       device product:java_joyplus_qb7 model:TM702B4_3G device:java_joyplus_qb7 transport_id:12"
echo transport_id !_transport_id!  (!_ID!^)
REM penult token
set "_ID="&set "_transport_id="
call :parse "" "F9NPFP084096           device product:WW_P023 model:P023 transport_id:11 device:P023_1"
echo transport_id !_transport_id!  (!_ID!^)
REM elsewhere token
set "_ID="&set "_transport_id="
call :parse "" "abc123def567           transport_id:10 device product:XX_P023 model:P023 device:P023_2"
echo transport_id !_transport_id!  (!_ID!^)
REM nowhere token
set "_ID="&set "_transport_id="
call :parse "" "noTransportId          sport_id:10 device product:XX_P023 model:P023 device:P023_2"
echo transport_id !_transport_id!  (!_ID!^)
)
goto :eof

:parse
if "%~2"=="" goto :eof 
for /F "tokens=1,*" %%G in ("%~2") do (
  if "%~1"=="" (
    set "_ID=%%~G"
    call :parse "%%~G" "%%~H" 
  ) else (
    for /F "tokens=1,2 delims=: " %%g in ("%~2") do (
      if /I "%%~g"=="transport_id" (
        set "_transport_id=%%~h"
      ) else (
        call :parse "%%~G" "%%~H" 
      )
    )
  )  
)
goto :eof
transport_id 12  (0123456789ABCDEF)
transport_id 11  (F9NPFP084096)
transport_id 10  (abc123def567)
transport_id   (noTransportId)