在批处理脚本中从 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 enabledelayedexpansion
,delayedexpansion
已经开启,所以你不需要再次开启。如果您只是从 for
循环中删除 setlocal
和 endlocal
命令,您的代码可能会在没有消失的修改值的情况下工作。
我有一个 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 enabledelayedexpansion
,delayedexpansion
已经开启,所以你不需要再次开启。如果您只是从 for
循环中删除 setlocal
和 endlocal
命令,您的代码可能会在没有消失的修改值的情况下工作。