在批

时间:2016-06-08 15:11:51

标签: batch-file cmd output

我正在尝试使用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 }

一切都很好,直到我在补丁列表的末尾读取最后一个补丁之后的行,然后打印""

我应该如何让它停止?

如果可能,我想避免使用文本文件。

2 个答案:

答案 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循环。

进一步阅读