我试图了解批处理文件中的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文件通常附带的花括号。
最佳答案
另一种更简单的方法:
@echo off
setlocal EnableDelayedExpansion
rem Read the lines of JSon file, removing braces
for /F "delims={}" %%a in (file.json) do (
set "line=%%~a"
rem Process each pair of "variable": "string" values
for %%b in ("!line:": "==!") do echo SET %%b
)
使用此输入文件:
{"SomeVariableName1": "Some String 1", "SomeVariableName2": "Some&String<2", "SomeVariableName3": "Some>String|3", "SomeVariableName4": "Some String 4"}
{"SomeVariableName1": "SomeString1", "SomeVariableName2": "SomeString2", "SomeVariableName3": "SomeString3", "SomeVariableName4": "SomeString4"}
{"SomeVariableName1": "SomeString1", "SomeVariableName2": "SomeString2", "SomeVariableName3": "SomeString3", "SomeVariableName4": "SomeString4"}
{"SomeVariableName1": "SomeString1", "SomeVariableName2": "SomeString2", "SomeVariableName3": "SomeString3", "SomeVariableName4": "SomeString4"}
...这是输出:
SET "SomeVariableName1=Some String 1"
SET "SomeVariableName2=Some&String<2"
SET "SomeVariableName3=Some>String|3"
SET "SomeVariableName4=Some String 4"
SET "SomeVariableName1=SomeString1"
SET "SomeVariableName2=SomeString2"
SET "SomeVariableName3=SomeString3"
SET "SomeVariableName4=SomeString4"
SET "SomeVariableName1=SomeString1"
SET "SomeVariableName2=SomeString2"
SET "SomeVariableName3=SomeString3"
SET "SomeVariableName4=SomeString4"
SET "SomeVariableName1=SomeString1"
SET "SomeVariableName2=SomeString2"
SET "SomeVariableName3=SomeString3"
SET "SomeVariableName4=SomeString4"
关于json - 如何在Pure Batch中解析JSon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51179898/