0

我正在尝试以 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循环中,我将数组补丁设置为从命令输出接收到的每个补丁。之后,我试图读取数组中的每个元素并按顺序打印它们。

* 这里它确实正确打印了第一个元素。但是当我用

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

它给了我一个空变量。

如何在另一个变量中传递一个变量?

4

2 回答 2

0

这对Xidel来说相当简单:

wmic qfe get HotfixID | xidel.exe -s - -e "{'patches':{|tokenize(normalize-space($raw),' ') ! {position():.}|}}"

将命令通过管道传输到 Xidel 的输入。创建 JSON 对象“补丁”。从那里通过首先规范化尾随空格然后创建每个条目的序列来处理输入。接下来用序列索引及其值填充对象。

输出:

{
  "patches": {
    "1": "KB123456",
    "2": "KB123456",
    "3": "KB123456",
    [...]
    "100": "KB123456",
  }
}
于 2019-01-09T00:25:00.410 回答
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)与补丁计数具有相同的值,并打印出不带逗号的结果。

于 2016-06-09T20:56:26.270 回答