[BAT脚本] 1、BAT脚本FOR循环操作文件和命令返回实例

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
posted @ 2018-10-31 20:31  beautifulzzzz  阅读(6148)  评论(0编辑  收藏  举报