2016-06-09 2 views
0

Я пытаюсь распечатать список исправлений в формате JSON, как например:Удаление нежелательных запятая JSON форматирования партии

"patches" : { 
"1" : "KB123456", 
"2" : "KB123456", ... 

Однако это то, что я получаю:

"patches" : { 
"1" : "", 
"2" : "patch[2]", 
"3" : "patch[3]", ... 

Это мой код

@echo off 
set count1=1  
setlocal enabledelayedexpansion 

set patches="wmic qfe get HotfixID" 
for /f "skip=1" %%i in (' %patches% ') do for /f "delims=" %%j in ("%%i") do (
    set patch[%count1%]=%%j 
    set /a count1=count1+1 
) 

if %count1%==1 (
    echo "patch" : "%patch[1]%", 
) else (
    echo "patches" : { 
    set index=0 

    :loop 
    set /a index=index+1 
    for /f "tokens=1" %%G in (" %patch[1]% ") do set p1=%%G ::<---* 
    echo %p1% 
    rem set p=%patch[!index!]% 
    rem echo "!index!" : "%p%", 
    if NOT "%index%" == "%count1%" goto :loop 

    set p=%patch[%count1%]% 
    echo "%count1%" : "%p%" 
    echo } 
) 
endlocal 

в моем первом for цикле я устанавливаю патч массива для каждого патча получил сюда m вывод команды. Впоследствии я пытаюсь прочитать каждый элемент в массиве и напечатать их по порядку.

* Здесь он правильно печатает первый элемент. Но когда я его заменяю

for /f "tokens=1" %%G in (" %patch[!index!]% ") do set p1=%%G 

Это дает мне пустую переменную.

Как передать переменную внутри другой переменной?

+0

Вы инициализируете% count1% до 1, но% index% to 0. Это то, что вызывает пустой первый элемент. Инициировать% count1% до 0 и посмотреть, исправляет ли он это. – rojo

+0

Я все еще получаю то же самое. даже если% count1% = 0 не должен видеть патч '' [0] "'? – KH17

+0

Я так не думаю, потому что вы увеличиваете count1 до установки первого элемента. Первым элементом в вашем массиве является 'patch [1]'. Но если 'patch [1]' пуст, вам может потребоваться изменить 'skip = 1' на' skip = 2' в вашем 'for/f'. – rojo

ответ

0

Так что я обнаружил, что в партии цикл for действует не так, как на других языках. Кажется, что вместо итерации он делает все в одно и то же время. Если вы хотите увеличивать переменную и делать что-то с ней в цикле for, вам нужно добавить setlocal enabledelayedexpansion и поместить переменную между !. Однако, как только вы выходите из цикла, вы можете получить к нему доступ, используя % _ % как я сделал с count_patch.

@echo off 
set count_patch=0 
set idx=0 
setlocal enabledelayedexpansion 

set patches="wmic qfe get HotfixID" 
for /f "skip=1" %%i in (' %patches% ') do for /f "delims=" %%j in ("%%i") do (
     set /a count_patch=count_patch+1 
     set patch[!count_patch!]=%%j 
) 

if %count_patch%==1 (
    echo "patch" : "%patch1%", 
) else (
echo "patches" : { 

for /f "skip=1" %%i in (' %patches% ') do for /f "delims=" %%j in ("%%i") do (
    set /a idx = idx+1 
    if !idx!==%count_patch% (echo "!idx!" : "%%j") else (echo "!idx!" : "%%j",) 
) 
echo } 
) 
endlocal 

Так что я сделал, я подсчитал количество исправлений и затем итерацию через них снова, пока мой индекс (IDX) имел такое же значение, что и подсчет патча и распечатан этот результат без запятой.

Смежные вопросы