原文件
.ini
:目标转换第2行和第三行成下方json
ini
[info]
listKey=key1^key2^key3
listName=A大^B最小^c最好
ccc=1^2^3^
ddd=0^1^9
目标格式
生成同名json
文件,并删除原ini
文件
json
[
{
"value":"key1",
"text":"A大"
},
{
"value":"key2",
"text":"B最小"
},
{
"value":"key3",
"text":"c最好"
}
]
bat最终实现
最需要注意的问题就是原来ini文件的格式,bat文件要保持一致,不然输入汉字程序就执行错误,源文件汉字还会乱码。
bash
@echo off
setlocal ENABLEDELAYEDEXPANSION
chcp 65001
set path=%cd%
set currow=1
:loop
for /r "%path%" %%i in (*.ini) do (
set filename=%%~ni
if "!filename!"=="" pause
echo [>!filename!.json
goto fileHandler
)
:fileHandler
for /f "skip=%currow% tokens=2 delims==" %%a in (!filename!.ini) do (
set /a num+=1
echo !currow!
if defined remain (echo !remain! --end) else if !currow!==1 (set remain=%%a)
if defined remain1 (echo !remain1! --end) else if !currow!==2 (set remain1=%%a)
if !currow!==1 goto keyHandler
if !currow!==2 goto nameHandler
)
:keyHandler
echo {>>!filename!.json
for /f "tokens=1* delims=^" %%b in ("%remain%") do (
echo "value":"%%b",>>!filename!.json
set currow=2
set remain=%%c
)
if defined remain1 (goto nameHandler) else (goto fileHandler)
:nameHandler
for /f "tokens=1* delims=^" %%d in ("%remain1%") do (
echo "text":"%%d">>!filename!.json
set currow=1
set remain1=%%e
)
if "!remain!"=="" (echo }>>!filename!.json) else (echo },>>!filename!.json)
if defined remain1 goto fileHandler
echo ]>>!filename!.json
del /f /p !filename!.json
set filename=""
set num=0
set remain=
goto loop
%cd%
当前目录路径echo 文字>xxx.txt
>
覆盖输入,>>
追加输入chcp 65001
utf-8set filename=%%~ni
:%%~ni
文件名%%~xi
文件后缀名,还有很多,用到什么可以查。if else
不能换行,执行语句加()
- 执行完一个文件变量值恢复一下,不然下一个文件会出错
- 当前代码在中文文件名会出错,没法转换。
重点说明
for /f "skip=%currow% tokens=2 delims==" %%a in (!filename!.ini)
for /f "tokens=1* delims=^" %%b in ("%remain%")
for /f
语句是用来逐行读取文件的。skip=%currow%
从第几行开始读取。delims=^
按照^
将每行拆分,可以写其他符号,也可以写多个符号或者字符。tokens
上面拆分的结果当作一个数组,如果直接写数字就是取每行第几个,*
代表所有,1*
第一个和其他,作用就是循环里%%b
%%c
就是对应的值。上面就是每次取第一个输出,后面的放到变量里,进入下一行同样操作,这样能让json一个{}里放两行对应的内容。- 后面
(!filename!.ini)
和("%remain%")
读取文件和字符串,也可以('type !filename!.ini|findstr string')这种格式。