Получить значение конфигурации json в переменную сценария Windows

Я хотел бы проанализировать файл config.json и получить некоторые конкретные значения в переменных.

Следующая команда работает, она выводит значение из json: type config.json | "jq-win64.exe" .path.editor

  • Содержимое config.json: { "path" : { "editor" : "...value..." } }

  • jq — библиотека для json (https://stedolan.github.io/jq/)

Вопрос в том, как получить это значение в какую-то переменную?

Я пробовал это, но не работает: set editorPath = type config.json | "jq-win64.exe" -r .path.editor

В результате %editorPath% пусто

Возможно, это связано с библиотекой jq (https://stedolan.github.io/jq/), но я Я совершенно нуб в оболочке Windows, поэтому, возможно, кто-то может помочь решить эту проблему.

Спасибо


person Jurosh    schedule 15.09.2015    source источник
comment
Вы можете найти этот ответ полезным. Поскольку ваш JSON отформатирован правильно, удалите фигурные скобки из строки eval и echo editor: !editor!.   -  person rojo    schedule 15.09.2015
comment
В общем случае, если вы хотите записать вывод команды в переменную, используйте цикл for /F. for /f "delims=" %%I in ('command') do set "variable=%%I" или аналогичный. См. help for в консоли cmd для получения дополнительной информации.   -  person rojo    schedule 15.09.2015
comment
Если один из приведенных ниже ответов был полезен, рассмотрите возможность выбора одного из них, чтобы отметить его как принятый. см. эту страницу, чтобы узнать, почему это важно.   -  person rojo    schedule 16.09.2015


Ответы (3)


В общем случае, если вы хотите записать вывод команды в переменную, используйте цикл for /F. for /f "delims=" %%I in ('command') do set "variable=%%I" или аналогичный. См. help for в консоли cmd для получения дополнительной информации.


Можно заставить JScript интерпретировать JSON так же, как JavaScript. Существуют проблемы безопасности; но если вы можете быть достаточно уверены, что никто не вставит вредоносный код в JSON, вы можете проанализировать его, не требуя сторонних инструментов.


Этот пример сценария сочетает в себе две идеи, упомянутые выше: вызов блока кода JScript с помощью cscript.exe и захват его вывода с помощью цикла for /f.

config.json:

{ "path" : { "editor" : "...value..." } }

parseJSON.bat:

@if (@CodeSection == @Batch) @then

@echo off
setlocal

set "JSONfile=config.json"

for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%JSONfile%"') do set "%%~I"

rem // Delayed expansion prevents path names with symbols (& or %) from choking the script
setlocal enabledelayedexpansion
echo editor: !editor!
endlocal

goto :EOF

@end // end batch / begin JScript chimera

var fso = WSH.CreateObject('scripting.filesystemobject'),
    JSONfile = fso.OpenTextFile(WSH.Arguments(0), 1);

eval('obj = ' + JSONfile.ReadAll());
JSONfile.Close();

function walk(tree) {
    for (var i in tree) {
        if (typeof tree[i] === 'object') walk(tree[i]);
        else WSH.Echo(i + '=' + tree[i]);
    }
}

walk(obj);

Вывод:

редактор: ...значение...

person rojo    schedule 15.09.2015
comment
Спасибо, это помогло мне понять проблему. Теперь у меня есть что-то вроде: for /f "delims=" %%I in ('readConfig .path.to.something') do set PathToSomething=%%I, и, похоже, это делает то, что мне нужно. readConfig выполняет только вывод команд jq... - person Jurosh; 16.09.2015

Вот иллюстрации двух подходов с использованием jq:

@echo off
setlocal

for /f "delims=" %%I in ('jq -n -r "\"123\""') do set A=%%I
echo A is %A%

jq -n -r  "@sh \"set B=123\"" > setvars.bat
call .\setvars.bat
echo B is %B%

В первом примере пакетный файл определяет имя переменной; во втором примере программа jq определяет имена переменных.

Кстати, для не-виндовсов есть "рецепт" по этому поводу в JQ Cookbook.

person peak    schedule 15.09.2015

Это очень просто для Xidel.

Точечное обозначение:

xidel -s config.json -e "($json).path.editor"

Обозначение XPath:

xidel -s config.json -e "$json/path/editor"

or even shorter

xidel -s config.json -e "$json//editor"

Экспортировать значение в переменную "editorPath":

FOR /F "delims=" %A IN ('xidel -s config.json -e "editorPath:=$json//editor" --output-format^=cmd') DO %A
person Reino    schedule 11.01.2019