【发布时间】:2018-12-13 06:18:08
【问题描述】:
我试图了解批处理文件中的 for 循环如何使用 /F "delims=" 选项但不使用标记遍历所有项目。我尝试了各种方法,但都失败了。首先,我知道还有其他方法可以读取 json 文件,但我只对学习如何在没有任何外部程序 jscript jq 等的情况下以纯批处理方式进行操作感兴趣。 JSon 格式如下所示,但项目数和顺序它们往往会有所不同。
{"SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString"}
{"SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString"}
{"SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString"}
{"SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString", "SomeVariableName": "SomeString"}
etc
但有时可能只是:
"SomeVariableName2": "SomeString2", "SomeVariableName1": "SomeString1",
例如我已经这样做了:
SetLocal DisableDelayedExpansion
For /F "delims=" %%c (file.json) Do(
REM iterate through each line
set "Line=%%c"
setlocal EnableDelayedExpansion
set CR=CRLFCRLF
Set "LineChange1=!Line:~1,-1!"
for %%d in ("!CR!") do set LineChange2=!LineChange1:", "=%%~d!
for %%e in (!LineChange4:CRLFCRLF= !) do set /a numtkns+=1
REM but don't know how to insert the above numtkns in for options as it seems to require a function.
set LineChange3=!LineChange2:": "==!
set LineChange4=!LineChange3:"=!
set /A Countr+=1
REM this leaves this current line stored in variable LineChange4 as SomeVariableName=SomeStringCRLFCRLFSomeVariableName=SomeStringCRLFCRLFSomeVariableName=SomeStringCRLFCRLFSomeVariableName=SomeString
)
或者,我可以使用换行符代替 CRLFCRLF:
SetLocal DisableDelayedExpansion
For /F "delims=" %%c (file.json) Do(
REM iterate through each line
set "Line=%%c"
setlocal EnableDelayedExpansion
for /f %%d in ('copy /Z "%~dpf0" nul') do (
set "CR=%%d"
)
Set "LineChange1=!Line:~1,-1!"
for %%e in ("!CR!") do set LineChange2=!LineChange1:", "=%%~e!
set LineChange3=!LineChange2:": "==!
set LineChange4=!LineChange3:"=!
set /A Countr+=1
)
这导致多行存储在变量 LineChange4 中:
SomeVariableName=SomeString
SomeVariableName=SomeString
SomeVariableName=SomeString
SomeVariableName=SomeString
如何遍历每个键值对并将每个值分配给与键同名的变量。我看过另一篇文章,他们确实设置了 var_%SomeVariableName%=SomeString 但它只适用于第一个键值对,我希望它遍历所有项目直到最后一个,即使令牌的数量和它们的顺序不同。
编辑:SomeString 可能是包含各种字符的标题,因此唯一近似已知的值是 SomeVariableName 键,它们往往没有空格。
Edit2:我最初并没有添加,我还使用“Set "LineChange1=!Line:~1,-1!" 来删除通常随 JSon 文件一起提供的花括号。
【问题讨论】:
标签: json parsing batch-file for-loop token