我正在尝试使用JSON格式化命令的输出:
echo "patches" : {
set patches="wmic qfe get HotfixID"
for /f "skip=1" %%i in (' %patches% ') do (
set /a count=count+1
call echo "!count!" : "%%i",
)
echo }
一切都很好,直到我在补丁列表的末尾读取最后一个补丁之后的行,然后打印""
。
我应该如何让它停止?
如果可能,我想避免使用文本文件。
答案 0 :(得分:3)
在for /f
循环中,放置另一个:
for /f "skip=1" %%i in ('%patches%') do for /f "delims=" %%j in ("%%i") do (
rem // use `%%j` in the loop body
)
wmic
命令返回Unicode输出。由于for /f
不适合处理此类问题,因此会产生像孤儿回车(CR)这样的人工制品,从而导致您遇到的效果(最后一行对于for /f %%i
循环来说并不是空的这样的CR;记住for /f
跳过真正空的行。在内部放置另一个for /f
循环并因此对每个项目进行双重处理会消除这些伪影。
这是固定的脚本:
echo "patches" : {
set "patches=wmic qfe get HotfixID"
for /f "skip=1" %%i in ('%patches%') do for /f "delims=" %%j in ("%%i") do (
set /a count=count+1
echo "!count!" : "%%j",
)
echo }
由于我没有达到call
命令的目的,我只是将其删除了。
双重解析方法实际上归功于dbenham - 请参阅他对Why is the FOR /f loop in this batch script evaluating a blank line?的回答以及他的外部文章WMIC and FOR /F : A fix for the trailing <CR> problem。
答案 1 :(得分:0)
WMIC
命令输出的最后一行空行
最简单的解决方案是使用findstr
删除空行:
for /f "skip=1" %%i in ('%patches% ^| findstr /r /v "^$"')
不需要额外的for
循环。