找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 42933|回复: 20

[文本处理] 【已解决】BAT代码从json文件只提取指定字段的值哪里有问题?

[复制链接]
发表于 2024-9-17 12:36:40 | 显示全部楼层 |阅读模式
想用批处理从json文件只提取指定字段的值,提取是成功了,但不知道为什么for语句不执行 do 里面的代码,是哪里写错了嘛?

cscript 部分的代码是从网上抄的,我对cscript执行代码完全小白。

这是 json 文件内容:
  1. {"media_type":2,"has_dash_audio":true,"is_completed":true,"total_bytes":37080115,"downloaded_bytes":37080115,"title":"七年级上册地理《世界气候类型的分布》人教版,提炼知识点,快速提分版,期中复习重点知识,帮助孩子归纳总结,地理逆袭考高分","type_tag":"116","cover":"http:\/\/i2.hdslb.com\/bfs\/archive\/db711b3345dc0f2c2e546d9586433484d19d0b78.jpg","video_quality":116,"prefered_video_quality":116,"guessed_total_bytes":0,"total_time_milli":415775,"danmaku_count":7,"time_update_stamp":1726490604122,"time_create_stamp":1726490595210,"can_play_in_advance":true,"interrupt_transform_temp_file":false,"quality_pithy_description":"1080P","quality_superscript":"60帧","variable_resolution_ratio":false,"cache_version_code":8130300,"preferred_audio_quality":0,"audio_quality":0,"avid":747920231,"spid":0,"seasion_id":0,"bvid":"BV1yC4y1E77K","owner_id":1865370698,"owner_name":"启梦学霸课堂","owner_avatar":"https:\/\/i2.hdslb.com\/bfs\/face\/c8722a5d4c191feae51be4966c5585b76f5b5173.jpg","is_charge_video":false,"verification_code":0,"page_data":{"cid":1319882112,"page":1,"from":"vupload","part":"七年级上册地理《世界气候类型的分布》人教版,提炼知识点,快速提分版,期中复习重点知识,帮助孩子归纳总结,地理逆袭考高分","link":"","rich_vid":"","vid":"","has_alias":false,"tid":208,"width":1080,"height":1920,"rotate":0,"download_title":"视频已缓存完成","download_subtitle":"七年级上册地理《世界气候类型的分布》人教版,提炼知识点,快速提分版,期中复习重点知识,帮助孩子归纳总结,地理逆袭考高分"}}
复制代码
这是批处理代码:
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. color a
  4. rem 从一个json文件中提取指定内容


  5. >"%tmp%\j.js" echo;var m=WSH.StdIn.ReadAll().match(/("title"):"[^"]+"/);if(m){WSH.StdErr.WriteLine(m[0]);}

  6. for /f %%i in ('type entry.json ^| cscript //B //nologo //e:jscript "%tmp%\j.js"') do (
  7.   set txt=%%i11111
  8.   echo !txt:9,-1!
  9. )
  10. pause
  11. exit
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

 楼主| 发表于 2024-9-17 12:37:47 | 显示全部楼层
结果是提取到了,但是显示完结果之后直接就到 pause 代码了,没有执行 do 里面的两行代码。
发表于 2024-9-17 14:09:59 | 显示全部楼层
回复 2# _avatar_



红色为修改部分。JS获取内容后添加11111,并从第9个字符开始截取后面的字符


@echo off
setlocal EnableDelayedExpansion
color a
rem 从一个json文件中提取指定内容


>"%tmp%\j.js" echo;var m=WSH.StdIn.ReadAll().match(/("title"):"[^"]+"/);if(m)WSH.echo(m[0]);

for /f "delims=" %%i in ('type entry.json ^| cscript /nologo -e:jscript "%tmp%\j.js"') do (
  set "txt=%%i11111"
  echo !txt:~9,-1!
)
pause
exit

评分

参与人数 1技术 +1 收起 理由
_avatar_ + 1 感谢帮助

查看全部评分

 楼主| 发表于 2024-9-17 15:50:31 | 显示全部楼层
回复 3# ppll2030

非常感谢,原来是我对 //B 参数理解有误。

另外,不知道哪里可以看 WSH 这个对象相关的API手册? 看了您的代码之后,我发现只需要将 后面 if 里的修改成 WSH.echo() 输出,并且去掉 //B 参数就可以了。
所以,不知道在哪可以学习 WSH 这个对象的具体用法?

PS: !txt:9,-1! 那是写错了,漏了个 ~ 。
发表于 2024-9-17 16:02:35 | 显示全部楼层
回复 4# _avatar_


本网站,首页,最下方,VBScript / JScript 在线参考
搜索 wscript对象

评分

参与人数 1技术 +1 收起 理由
_avatar_ + 1 感谢指路

查看全部评分

 楼主| 发表于 2024-9-17 17:10:46 | 显示全部楼层
回复 5# czjt1234


    感谢指路,大概有点底了,慢慢学习。
发表于 2024-9-17 18:14:59 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-9-17 18:21 编辑

回复 1# _avatar_

再给两个版本(分别存为批处理脚本文件 *.bat 运行),都用 cmd+jscript 混编方式,省略了临时文件。一版是直接采用 for 分隔器一步到位,二版是直接采用 jscript 正则匹配一步到位...

第一版 test-1.bat

  1. @set @v=1 /* &echo off
  2. for /f tokens^=2^delims^=:^" %%i in ('type "entry.json"^|cscript /nologo /e:jscript "%~f0"') do echo,%%i
  3. pause&exit/b */
  4. m=WSH.stdin.readall().match(/"title":"[^"]+"/), WSH.echo(m[0]), WSH.quit()
复制代码
第二版 test-2.bat

  1. @set @v=1 /* &echo off
  2. for /f %%i in ('type "entry.json"^|cscript /nologo /e:jscript "%~f0"') do echo,%%i
  3. pause&exit/b */
  4. m=WSH.stdin.readall().match(/[^"]+(?=","type_tag")/), WSH.echo(m[0]), WSH.quit()
复制代码
 楼主| 发表于 2024-9-17 20:55:35 | 显示全部楼层
回复 7# aloha20200628


    多谢指教,学习啦。
 楼主| 发表于 2024-9-17 21:08:37 | 显示全部楼层
回复 7# aloha20200628


    另外想问一下,代码中的 @set @v=1 作用是什么?
发表于 2024-9-17 21:49:24 | 显示全部楼层
回复 9# _avatar_

一种脚本代码与批处代码混编的关键,就是要在批处代码中找出能被自身语法接受的最短且最有效句式(桥段),以便接续其注释符,@set @v=1 就是 jscript 代码与批处代码混编的一种典型 ‘桥段’...
 楼主| 发表于 2024-9-17 22:35:37 | 显示全部楼层
回复 10# aloha20200628


    就是 @set @v=1 其实本身没有什么作用,只是为了后面的 /* 不会报错而已,这样理解对吧。

    现在碰到了一个新问题,就是如果 json 获取到的结果的最后如果是中文字符,最后一个字符会乱码,类似于这篇帖子: http://bbs.bathome.net/viewthrea ... hlight=%C2%D2%C2%EB

    正在搜索看看有没有解决办法。
发表于 2024-9-17 23:47:43 | 显示全部楼层
回复 11# _avatar_

第一个问题:是
第二个问题:引用帖 http://bbs.bathome.net/viewthrea ... hlight=%C2%D2%C2%EB 中一楼的示例代码若存为 ansi 编码或 utf-8无头标 编码均可规避报错,用win7系统测试通过...
 楼主| 发表于 2024-9-18 00:36:37 | 显示全部楼层
回复 12# aloha20200628


    并不是报错,是中文的最后一个字符会乱码。
    我用的 win10 ,倒是没有在win7中测试过。
发表于 2024-9-18 11:12:03 | 显示全部楼层
回复 13# _avatar_

引用帖中有建议在获取的中文数据后附加英文空白字符即可解...
 楼主| 发表于 2024-9-18 19:08:19 | 显示全部楼层
回复 14# aloha20200628


    已经尝试过了,哪怕用正则往后多匹配几个英文字符也没用,除非是手动修改json文件,在中文字符的最后添加上一个英文字符。
    在jscript代码中添加英文字符也不生效,最后一个字符还是会乱码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 21:06 , Processed in 0.022472 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表