我试图以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
它给了我一个空变量。
如何在另一个变量中传递变量?
答案 0 :(得分: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)与补丁计数具有相同的值并打印出没有逗号的结果。
答案 1 :(得分: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",
}
}