Я пытаюсь понять, как циклы 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.