2016-06-09 11 views
0

ich die Liste der Patches im JSON-Format als solche auszudrucken bin versucht:unerwünschte Komma für JSON Formatierung Batch Entfernen

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

Allerdings ist es das, was ich bekomme:

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

Dies ist mein Code

@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 

In meinem ersten for Schleife ich das Array Patch bin Einstellung zu jedem Patch her empfangen m die Befehlsausgabe. Danach versuche ich, jedes Element in dem Array zu lesen und sie in der Reihenfolge zu drucken.

* Hier wird das erste Element korrekt gedruckt. Aber wenn ich ersetzen, dass mit

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

es mir eine leere Variable gibt.

Wie gebe ich eine Variable innerhalb einer anderen Variablen weiter?

+0

Sie initialisieren% count1% auf 1, aber% index% auf 0. Das verursacht das leere erste Element. Init% count1% bis 0 und sehen, ob es das behebt. – rojo

+0

Ich bekomme immer noch das Gleiche. selbst wenn die% count1% = 0 sollte ich nicht sehen "patch [0]" '? – KH17

+0

Ich glaube nicht, weil Sie count1 erhöhen, bevor Sie das erste Element setzen. Das erste Element in Ihrem Array ist 'patch [1]'. Aber wenn 'patch [1]' leer ist, dann müssen Sie möglicherweise 'skip = 1' in' skip = 2' in Ihrer 'for/f'-Schleife ändern. – rojo

Antwort

0

So entdeckte ich, dass im Batch die for Schleife nicht so funktioniert wie in anderen Sprachen. Es scheint, als ob statt einer Iteration alles gleichzeitig geschieht. Wenn Sie innerhalb einer for Schleife eine Variable inkrementieren und etwas damit machen wollen, müssen Sie setlocal enabledelayedexpansion hinzufügen und die Variable zwischen ! setzen. Wenn Sie jedoch außerhalb der Schleife sind, können Sie darauf zugreifen, indem Sie % _ % verwenden, wie ich es mit count_patch getan habe.

@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 

Also, was ich tat, war, zählte ich die Anzahl der Patches und dann ohne Komma durch sie wieder, bis mein Index (IDX) hatte den gleichen Wert wie der Patch-Zählung und gedruckt, das Ergebnis wiederholt.