bat脚本:将ini文件两行值转json格式

原文件

.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-8
  • set 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%")

  1. for /f 语句是用来逐行读取文件的。
  2. skip=%currow% 从第几行开始读取。
  3. delims=^ 按照^将每行拆分,可以写其他符号,也可以写多个符号或者字符。
  4. tokens 上面拆分的结果当作一个数组,如果直接写数字就是取每行第几个,*代表所有,1*第一个和其他,作用就是循环里 %%b %%c就是对应的值。上面就是每次取第一个输出,后面的放到变量里,进入下一行同样操作,这样能让json一个{}里放两行对应的内容。
  5. 后面(!filename!.ini)("%remain%")读取文件和字符串,也可以('type !filename!.ini|findstr string')这种格式。
相关推荐
課代表1 天前
bat 批处理中 FOR 命令的变量修饰符
脚本·bat·环境变量·批处理·路径·扩展名·短名称
課代表2 天前
PowerShell 目录树生成与递归算法陷阱:目录统计为何从0变多?
脚本·powershell·bat·目录·计数·文件夹·树状结构
计算衎3 天前
Window下关于robocopy命令的讲解以及和Copy命令的区别
开发语言·bat
課代表16 天前
bat 批处理脚本中的字符串
字符串·脚本·命令行·bat·批处理·字符串截取·延迟变量
課代表24 天前
正则表达式中的“*”为何不是通配符?
正则表达式·dos·bat·批处理·匹配·通配符·转义
課代表1 个月前
bat 批处理中的路径:%CD%与%~dp0
脚本·bat·环境变量·目录·批处理·路径·相对路径
課代表1 个月前
bat 批处理从文本文件自动创建文件夹
自动化·脚本·bat·批处理·txt·文件编码·文件夹创建
課代表1 个月前
Windows 批处理 bat 变量扩展名
windows·命令行·bat·批处理·扩展名·递归遍历·后缀名
Logic1011 个月前
《Windows批处理(BAT)脚本实战大全:41个场景告别重复操作》含文件处理/查找/重命名/清理等)
windows·编程·文件管理·bat·效率工具·批处理·自动化脚本
課代表2 个月前
bat 批处理文件重命名加时间戳
时间·重命名·bat·时间戳·命令·批处理·字符串截取