Wednesday, 31. October 2018 08:18PM - beautifulzzzz


一、需求

需要在windows上实现一个bat脚本解析json,将json转换为自己想要的key-value样式,来压缩复杂json。

此外为了保证脚本的灵活性,我在json中添加一个bat节点,用于指明需要抽取该json中的哪些节点进行压缩( 1>某些节点信息没有用,因此不用提取;2>节点所对应的key太长了,因此可以用新的key替代老的key来压缩)


二、json例子

json例子如下 a.json

{
"light": {
"bat": {
"value": [
"/.light.category.value/category/",
"/.light.dmod.value/dmod/",
"/.light.color.r.pin.value/rpin/",
"/.light.color.r.lv.value/rlv/",
"/.light.color.g.pin.value/gpin/",
"/.light.color.g.lv.value/glv/",
"/.light.color.b.pin.value/bpin/",
"/.light.color.b.lv.value/blv/",
"/.light.color.cct_l.pin.value/cct_lpin/",
"/.light.color.cct_l.lv.value/cct_llv/",
"/.light.color.cct_wc.pin.value/cct_wcpin/",
"/.light.color.cct_wc.lv.value/cct_wclv/",
"/.light.other_lamp.min_lum.value/min_lum/",
"/.light.other_lamp.pwmhz.value/pwmhz/"]
},
"cmod": {
"value": "rgbwc"
},
"dmod": {
"value": "pwm"
},
"color": {
"cct_l": {
"pin": {
"value": 6
},
"lv": {
"value": true
}
},
"r": {
"pin": {
"value": 7
},
"lv": {
"value": true
}
},
"b": {
"pin": {
"value": 4
},
"lv": {
"value": true
}
},
"g": {
"pin": {
"value": 3
},
"lv": {
"value": true
}
},
"cct_wc": {
"pin": {
"value": 5
},
"lv": {
"value": true
}
}
},
"other_lamp": {
"min_lum": {
"value": 10
},
"pwmhz": {
"value": 8000
}
},
"ickind": {
"value": "tlsr8266"
},
"category": {
"value": "0501"
}
}
}

三、bat脚本

解析脚本为 a.bat

该脚本首先从a.json中读取bat的值:

1)这里不直接用.light.bat.value的原因是:light关键词可能是其他值,因此需要采用特殊的写法进行模糊匹配;

2)这里使用bat的FOR的用法,比较复杂,其中:delims=/ tokens=2,3的意思是每次执行jq-win64.exe...的命令返回的每一行,通过/分割为多列,取其中的第2、3列赋值给%%I和%%J;

3)mzip是读取文件的多行,并输出一行字符串;

@echo off
setlocal enabledelayedexpansion set out_file=config.bin echo {> %out_file% for /F "delims=/ tokens=2,3" %%I in ('jq-win64.exe ".[] | .bat.value[]" a.json') do (
echo %%I
echo %%J
call:fjq %%I %%J
) echo }>> %out_file% cat %out_file%
call:mzip
cat %out_file% pause
goto:eof :fjq
echo %2:>> %out_file%
jq-win64.exe %1 a.json>> %out_file%
echo ,>> %out_file%
goto:eof :mzip
set "Str="
for /f "delims=" %%b in (%out_file%) do (
set "Str=!Str!%%~b"
)
>tmp$ echo !Str!
move /y tmp$ "%out_file%" >nul
goto:eof

四、总结

本文主要运用了:windows的bat脚本技术、jq解析json技术、动态脚本技术。

  • BAT FOR循环的用法
  • BAT 函数的用法
  • BAT 读取文件的多行,合并为一行字符串输出
  • jq对json的模糊匹配
  • 动态脚本

@beautifulzzzz
智能硬件、物联网,热爱技术,关注产品
博客:http://blog.beautifulzzzz.com
园友交流群:414948975

[BAT脚本] 1、BAT脚本FOR循环操作文件和命令返回实例的更多相关文章

  1. 【转载】恢复误删文件--DOS命令应用实例(一)

    <电脑爱好者>报转载第一辑第二篇之恢复误删文件--DOS命令应用实例(一)                             恢复误删文件--DOS命令应用实例(一) 上期我们讲述了 ...

  2. windows BAT脚本2个服务器间传递文件

    1. 脚本功能: 实现2个服务器间文件的传递,例如从A服务器往B服务器上传文件 2. 实现步骤: 2.1 服务器连结,找到指定路径,读取所需要上传的文件,将文件名称复制到一个文件下 (此处考虑可能需要 ...

  3. bat脚本删除一周前的文件

    bat脚本删除7天前的文件 @echo off forfiles /p D:\logstash-1.4.2\bin\ /m *.log -d -7 /C "cmd /c del /f @pa ...

  4. [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat

    概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...

  5. [Tomcat 源码分析系列] (一) : Tomcat 启动脚本-startup.bat

    概述 我们通常使用 Tomcat 中的 startup.bat 来启动 Tomcat. 但是这其中干了一些什么事呢? 大家都知道一个 Java 程序需要启动的话, 肯定需要 main 方法, 那么这个 ...

  6. 用python & bat写软件安装脚本 + HM NIS Edit自动生成软件安装脚本

    2019-03-11更新:原来NSIS脚本也可以禁用64位文件操作重定向的! 1.在安装脚本的开始处定义 LIBRARY_X64. !include "MUI.nsh"!inclu ...

  7. windows脚本bat编程:WIN10脚本自动启动虚拟环境中的jupyter

    python编程对各种扩展包的版本依赖较严格,为了解决版本差异,通用情况下会使用virtualenv创建的虚拟环境来独立应用.那么每次使用的时候就需要启动虚拟环境,如果每次都是手工启动,每次输入几条命 ...

  8. Windows系统使用vbs脚本或bat脚本强制杀死指定所有进程 vbs实现循环持续写入内容到vbs打开开的记事本 使用vbs、bat添加windows计划任务 使用cmd schtasks命令添加windows计划任务

    以下脚本windows7下成功运行过,脚本也可以windows计划任务程序一起组合使用 新建一个记事本文档粘贴下面代码后将新建的记事本文档重命名下面对应的脚本名就能使用了: 添加windows计划任务 ...

  9. BAT脚本如何自动执行 adb shell 以后的命令

    @echo off echo su > temp.txt echo 其它命令 >> temp.txt adb shell < temp.txt del temp.txt 求问 ...

随机推荐

  1. Neo4j 第十篇:更新数据

    更新图包括图的节点和关系的创建.更新和删除,也能更新图的节点和关系的属性.节点标签和关系类型. 一,创建节点 1,创建空的节点 CREATE (n) CREATE (a),(b) 2,创建带标签的节点 ...

  2. yield return,yield break

    转自, http://www.cnblogs.com/kingcat/archive/2012/07/11/2585943.html yield return 表示在迭代中下一个迭代时返回的数据,除此 ...

  3. Python struct与小端存储

    参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017685387246080 在使用Python 实现字符向字节数据类型转换的时候,P ...

  4. 洛谷 p1541乌龟棋

    洛谷 p1541乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏 ...

  5. reduce求和真方便

    1.reduce的用法. reduce是JavaScript中的一个方法,常用于数组求和,接收两个参数,第一个参数为累加函数,第二个参数为初始值,这个初始值是前面那个累加函数的参数.如果不指定初始值, ...

  6. Arduino+esp8266-01+舵机 制作基于局域网的遥控门禁

    这个最终的效果呢,就是可以通过手机连接上esp8266创建的wifi,然后连接其创建的服务器,发送特定指令就可实现遥控开门 (做工比较粗糙还请不要见笑...) 一.原理 其实这个一看就会明白,非常简单 ...

  7. swift中文版和网站

    http://www.chinaz.com/swift/chapter2/01_The_Basics.html http://www.iphonetrain.com/video_info/290.ht ...

  8. 团队作业第3周——需求改进&系统设计(crtl冲锋队)

    2.需求&原型改进: 1.问题:游戏中我方飞机和敌方飞机是怎么控制的? 改进: 在游戏中,我控制我方飞机,按下方向键飞机便向按下的方向移动,按下Z键,我方飞机发射子弹. 敌方飞机面向随机的方向 ...

  9. PL/SQL Developer报错 ORA-12154:tns:could not resolve the connect identifier specified

    PL/SQL Developer使用预先配置数据库报错 ORA-12154:tns:could not resolve the connect identifier specified. 情况描述:我 ...

  10. nrm : 无法加载文件 C:\Users\TANG\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本。

    1.win+s 搜索powershell 以管理身份运行 2.使用set-ExecutionPolicy RemoteSigned命令将计算机上的执行策略更改为 RemoteSigned,输入Y确定 ...