在批处理脚本中从 txt 文件数据创建 json 变量

creating json variable from txt file data in batch script

我有一个 txt 文件,输入为 -

First Line data here ...
Second, line data ; here
Third. line data here ..,

我有以下 bat 脚本代码来逐行读取 txt 文件,并且 tmp 变量中的值理想情况下应该类似于 -

{ "s1":"First Line data here ...","s2":"Second, line data ; here","s3":"Third. line data here ..,"}

没有给我预期输出的 bat 脚本代码看起来像 -

@echo off
set /a count=1
set tmp=

SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ data.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    call :processline !var!
    ENDLOCAL
)
pause
goto :END


:processline
set txt="%*"
set inp="s%count%"
IF "!tmp!" EQU "" (
        echo if called
        set tmp=%inp%:%txt%
    ) ELSE (
        echo else called
        set tmp=%tmp%,%inp%:%txt%
    )
set /a count+=1
exit /b 0

:END
echo end called
echo -------
echo %tmp%}
pause

通过一些调试,我注意到“set tmp=%inp%:%txt%”行实际上没有在全局范围内设置并且始终为空,我如何修改此代码以实现所需的json 在 tmp 中查找输出?

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory & filename are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "filename1=%sourcedir%\q71959582.txt"
SET "json="

FOR /F "usebackq tokens=1*delims=:" %%b in (`findstr /n . "%filename1%"`) do SET "json=!json!"s%%b":"%%c","
SET "json={ %json:~0,-1%}"
SET json

findstr 只是在文件的每一行前加上 serial: 前缀。

for /f 解析结果行,将序列号放入 %%b 并将 : 之后的行的其余部分放入 %%c.

set 只是将 "s<serialnumber>":"<line contents>", 附加到 json

的现有值

然后所需要的就是将前缀和后缀大括号添加到构建的 json 值中,全部禁止终端 ,

你的代码不起作用的原因(我没试过,所以这是理论上的)是 for 循环中的 setlocal/endlocal 括号建立了环境的本地副本,对其进行操作,然后在执行 endlocal 时恢复原始值。

由于你在代码开头执行了一个setlocal enabledelayedexpansiondelayedexpansion已经开启,所以你不需要再次开启。如果您只是从 for 循环中删除 setlocalendlocal 命令,您的代码可能会在没有消失的修改值的情况下工作。