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. Docker入门学习及其安装

    1.Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源.Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的Linux机器 ...

  2. ElasticSearch简介(一)——基础

    基本概念 1.  Node 与 Cluster Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例. 单个 Elastic 实例称为一个节点 ...

  3. 使用角色管理工具 安装或配置microsoft.net framework 3.5 sp1

    解决方法:

  4. SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码(转载)

    在sql中怎么查看一个字符的ascii编码或Unicode编码: SELECT ASCII('a') AS [AsciiNum]--字符获取ASCII码 SELECT UNICODE(N'a') AS ...

  5. ef linq多表查询(三表)

    var ph = (from c in reef.CQICC_CLIENT join v in reef.CQICC_VISIT_CLIENT on c.CLIENT_T_ID equals v.CL ...

  6. 遍历倒排索引核心类:SegmentTermDocs/SegmentTermPositions

    查询有哪些文档包含某个词元是Lucene搜索非常基础的一个功能,上层的搜索功能和索引功能都要基于这个功能来搭建.SegmentTermDocs就是查询词元所属文档的核心类,SegmentTermPos ...

  7. JavaScript 字符串(String) 大全

    JavaScript字符串存储一系列字符,如“John Doe”.字符串可以是双引号或单引号内的任何文本: <!DOCTYPE html> <html> <meta ch ...

  8. C++优先队列例子

    #pragma GCC optimize(3) #include <bits/stdc++.h> #define N 105 using namespace std; struct Nod ...

  9. Delphi对Excel保护操作

    http://www.docin.com/p-378093577.html在金融系统的应用系统中经常需要与Excel交换数据或利用Excel制作报表,但在某些情况下,我们的业务系统要求生成的临时或最终 ...

  10. 听说看了这篇文章就彻底搞懂了什么是OPC(上)

    从2000年初以来,我们就一直在使用OPC软件互操作性标准,而那些正准备踏入和想要踏入工业自动化领域的人们却对这些含义感到困惑. 所以在本中,我将系统地为你梳理OPC知识. OPC首字母缩写词代表什么 ...