[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】批处理提取指定字符内容

描述:
1、需提取的是一个Cook信息,是在一行内,想提取SESSDATA=167.......0C;这段内容。
2、之前用得笨办法,是以;分隔来数SESSDATA位于第几个来提取,但现在SESSDATA值在29位,而字母只有26个,已超出范围,没法用,除非先删除一部分内容,再弄,这样挺麻烦的。
故发贴求助大佬指导!

注:以下仅举例,所有的值,均已被处理过,替换为Z...3了,实际都是不同的字符内容。知悉!
CURRENT_BLACKGAP=Z...3; hit-dyn-v2=Z...3; FEED_LIVE_VERSION=Z...3; LIVE_BUVID=Z...3; PVID=Z...3; rpdid=Z...3; buvid_fp_plain=Z...3; buvid_fp=Z...3; buvid4=Z...3; _uuid=Z...3; fingerprint=Z...3; bmg_af_switch=Z...3; CURRENT_QUALITY=Z...3; bmg_src_def_domain=Z...3; browser_resolution=Z...3; enable_web_push=Z...3; header_theme_version=Z...3; home_feed_column=Z...3; b_nut=Z...3; buvid3=Z...3; bsource_origin=Z...3; bmg_af_switch=Z...3; bmg_src_def_domain=Z...3; share_source_origin=Z...3; bili_ticket=Z...3; bili_ticket_expires=Z...3; DedeUserID=Z...3; DedeUserID__ckMd5=Z...3; SESSDATA=167.......0C; bili_jct=Z...3; sid=Z...3; bp_t_offset_330614218=Z...3; CURRENT_FNVAL=Z...3; b_lsid=Z...3; bsource=Z...3
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

试试这一些
链接
bat小白,请多指教!谢谢!

TOP

回复 2# 77七


  谢谢帮助!我认真看看研究下

目前我是采用下面的笨办法来的,缺点是获取的SESSDATA位置再变化,代码也要手动改,没法自动精准识别。
  1. for /f "tokens=28*" %%a in (test.txt) do (set temp1=%%b)
  2. for /f "tokens=1-2 delims=; " %%a in ('echo %temp1%') do (set cookie_SESSDATA=SESSDATA=%%b)
  3. echo %cookie_SESSDATA%;
  4. echo %cookie_SESSDATA%;>cookie2.txt
复制代码

TOP

回复 3# fzp070

  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "useback delims=" %%a in ("1.txt") do (
  4. set str=%%a
  5. setlocal enabledelayedexpansion
  6. for /f "delims==;" %%b in ("!str:*SESSDATA=!") do (
  7. endlocal
  8. echo %%b
  9. )
  10. )
  11. pause
复制代码
1

评分人数

    • fzp070: 优秀!完美解决。技术 + 1
bat小白,请多指教!谢谢!

TOP

  1. @echo off
  2. cd /d "%~dp0"
  3. set /p str=<"1.txt"
  4. set "str=%str:;=&set %"
  5. set %str%
  6. echo %SESSDATA%
  7. pause
复制代码
1

评分人数

    • fzp070: 更精简,完美解决!技术 + 1
bat小白,请多指教!谢谢!

TOP

回复 4# 77七


    非常感谢!完美解决!
我太弱了,"!str:*SESSDATA=!" 这种定位方法我都不知道。

TOP

回复 5# 77七


    5楼代码也通过,更精简了,感谢大神!

TOP

本帖最后由 aloha20200628 于 2024-12-14 20:28 编辑

回复 1# fzp070

另一个版本...
  1. @echo off & setlocal
  2.    set "line=CURRENT_BLACKGAP=Z...3; hit-dyn-v2=Z...3; FEED_LIVE_VERSION=Z...3; LIVE_BUVID=Z...3; PVID=Z...3; rpdid=Z...3; buvid_fp_plain=Z...3; buvid_fp=Z...3; buvid4=Z...3; _uuid=Z...3; fingerprint=Z...3; bmg_af_switch=Z...3; CURRENT_QUALITY=Z...3; bmg_src_def_domain=Z...3; browser_resolution=Z...3; enable_web_push=Z...3; header_theme_version=Z...3; home_feed_column=Z...3; b_nut=Z...3; buvid3=Z...3; bsource_origin=Z...3; bmg_af_switch=Z...3; bmg_src_def_domain=Z...3; share_source_origin=Z...3; bili_ticket=Z...3; bili_ticket_expires=Z...3; DedeUserID=Z...3; DedeUserID__ckMd5=Z...3; SESSDATA=167.......0C; bili_jct=Z...3; sid=Z...3; bp_t_offset_330614218=Z...3; CURRENT_FNVAL=Z...3; b_lsid=Z...3; bsource=Z...3"
  3.    setlocal enabledelayedexpansion &set "go=1" &set "ok="
  4.    for %%a in (!line!) do if defined go if /i "%%a"=="SESSDATA" (set/a "ok=1") else if defined ok (set "go=" &set "v=%%a")
  5.    echo,SESSDATA=!v!&pause&exit/b
复制代码
1

评分人数

    • fzp070: 此楼代码有些问题,大佬再帮忙看看!技术 + 1

TOP

本帖最后由 aloha20200628 于 2024-12-13 09:59 编辑

回复 3# fzp070

用 grep.exe 更直截了当... (本坛第三方下载 grep.exe 落地即用 http://bcn.bathome.net/s/tool/index.html?key=grep
  1. @echo off & setlocal
  2.    set "line=CURRENT_BLACKGAP=Z...3; hit-dyn-v2=Z...3; FEED_LIVE_VERSION=Z...3; LIVE_BUVID=Z...3; PVID=Z...3; rpdid=Z...3; buvid_fp_plain=Z...3; buvid_fp=Z...3; buvid4=Z...3; _uuid=Z...3; fingerprint=Z...3; bmg_af_switch=Z...3; CURRENT_QUALITY=Z...3; bmg_src_def_domain=Z...3; browser_resolution=Z...3; enable_web_push=Z...3; header_theme_version=Z...3; home_feed_column=Z...3; b_nut=Z...3; buvid3=Z...3; bsource_origin=Z...3; bmg_af_switch=Z...3; bmg_src_def_domain=Z...3; share_source_origin=Z...3; bili_ticket=Z...3; bili_ticket_expires=Z...3; DedeUserID=Z...3; DedeUserID__ckMd5=Z...3; SESSDATA=167.......0C; bili_jct=Z...3; sid=Z...3; bp_t_offset_330614218=Z...3; CURRENT_FNVAL=Z...3; b_lsid=Z...3; bsource=Z...3"
  3.    echo,"%line%"|grep -o "SESSDATA=[^;]*"
  4. pause&exit/b
复制代码
1

评分人数

    • fzp070: 这个不错,运用到实际中,也完美解决!技术 + 1

TOP

回复 5# 77七


    刚应用在实际中时,发现5楼方法不太稳定,换了个文本内容,程序就闪退了。而且原文本最后加个;,也会出错。
4楼方法稳定没问题。有这个就可以了。

TOP

本帖最后由 fzp070 于 2024-12-12 21:54 编辑

回复 8# aloha20200628


    8楼的代码直接运行是可以的,但实际运用中,发现也有问题,遇到内容中含|符号时,会获取不到或闪退,跟5楼问题一样。

    9楼的代码已试OK,代码很精简,不错。

感谢大佬指导!

TOP

本帖最后由 77七 于 2024-12-12 22:03 编辑

回复 10# fzp070


   可添加引号转义特殊字符,但是不知道还会不会有其它问题,总之,对于 简单文本,可以利用5楼实现快速赋值。
  1. (set "str=%str:;="&set "%") 1>nul
复制代码



如下代码 字符串含有特殊字符, echo %字符串% 会引起闪退
需开启变量延迟扩展再 echo
  1. set "str=|"
  2. setlocal enabledelayedexpansion
  3. echo !str!
复制代码
1

评分人数

    • fzp070: 感谢指教!技术 + 1
bat小白,请多指教!谢谢!

TOP

回复 12# 77七


    感谢大佬指教!

刚试了下,按大佬说的操作,如果是以1楼字符,加上;或者加上|,都是可以。但以实际获得的字符,还是不行,获取为空。不过不再闪退。
不过,发现用for来获取文本,替换大佬set /p 方戒获取文本代码,反而可以了。见下
另外8楼代码,通过增加setlocal enabledelayedexpansion,也不闪退了。问题目前来看是解决了。
  1. @echo off
  2. cd /d "%~dp0"
  3. ::set /p str=<"test2.txt"&rem ---------------------------------------------------------此代码舍弃
  4. for /f "tokens=*"  %%a in (test2.txt) do (set "str=%%a") &rem -------------------------------【换成此】
  5. ::set "str=%str:;=&set %"&rem -------------------------------------------------------此代码舍弃
  6. (set "str=%str:;="&set "%") 1>nul
  7. setlocal enabledelayedexpansion
  8. set !str!
  9. ::echo !SESSDATA!
  10. set cookie_SESSDATA=SESSDATA=!SESSDATA!;
  11. echo !cookie_SESSDATA!
  12. echo !cookie_SESSDATA!>cookie3.txt
  13. TIMEOUT /T 3 /NOBREAK
  14. exit
复制代码

TOP

本帖最后由 aloha20200628 于 2024-12-14 20:31 编辑

回复 11# fzp070

   如果一楼示例字符串中包含 |& 等cmd转义字符,须用双引号包裹字符串变量 line 赋值表达式,须用双引号包裹 echo 输出数据,须将 for %%a in (%line%) ... 句式改为变量延迟句式以便逃逸 cmd 对 %line% 的预处理... 据此已订正8楼代码。
   如果源数据被存入文本文件(假定为 1.txt)且只有一行,可用以下版本
  1. @echo off &setlocal &set "go=1" &set "ok="
  2. for /f "delims=" %%a in (1.txt) do for %%x in (%%a) do if defined go if /i "%%x"=="SESSDATA" (set/a "ok=1") else if defined ok (set "go=" &set "v=%%x")
  3. set/p="SESSDATA=%v%"<nul&echo,&pause&exit/b
复制代码
若用 grep 一行流则可提取出 1.txt 中每行(若不止一行数据)的目标字段 "SESSDATA=...",并可定向输出到 2.txt
  1. type "1.txt"|grep -o "SESSDATA=[^;]*">"2.txt"
复制代码
1

评分人数

    • fzp070: 修改后OK,只是输出多了双引号。技术 + 1

TOP

回复 14# aloha20200628


    感谢大佬详细指导,问题昨天都解决了,至少当前遇到的COOKie字符是没问题了。
昨天在 @77七 大神的指导下,用了 setlocal enabledelayedexpansion就可以,之前没用这变量延迟,只用双引号包括试了是不行的。grep一直都没问题。

再次感谢两位大才的热心指导。

TOP

返回列表