Batch file 正在批处理中跳过WMIC命令输出的最后一个空行

Batch file 正在批处理中跳过WMIC命令输出的最后一个空行,batch-file,cmd,output,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 } 一切都很好,直到我到达补丁列表的末尾,它读取最后一个补丁后的行,然后打印“” 我怎样才能让它在该停的时候停下来 如果可能,我希

我试图将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 }
一切都很好,直到我到达补丁列表的末尾,它读取最后一个补丁后的行,然后打印

我怎样才能让它在该停的时候停下来


如果可能,我希望避免使用文本文件

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 }
由于我没有得到
调用
命令的目的,我只是删除了它



实际上,双重解析方法的功劳在于——参见他的答案和他的外部文章。

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 }
由于我没有得到
调用
命令的目的,我只是删除了它


这种双重解析方法实际上要归功于——参见他的答案和他的外部文章。

跳过批处理中
WMIC
命令输出的最后一行空行

最简单的解决方法是使用<代码> FordSTR < /C> >删除空白行:

for /f "skip=1" %%i in ('%patches% ^| findstr /r /v "^$"')
对于循环,无需额外的


进一步阅读
  • -对于所有与Windows命令行相关的内容都是一个很好的参考
  • -搜索文件中的字符串
跳过批处理中
WMIC
命令输出的最后一个空行

最简单的解决方法是使用<代码> FordSTR < /C> >删除空白行:

for /f "skip=1" %%i in ('%patches% ^| findstr /r /v "^$"')
对于
循环,无需额外的


进一步阅读
  • -对于所有与Windows命令行相关的内容都是一个很好的参考
  • -搜索文件中的字符串

for/f
循环中,将另一个
for/f“delims=“%%j in(“%%i”)do
放入
%%j
并在
回音中使用
%%j
;由于
wmic
返回Unicode输出,而
for/f
不适合处理该输出,因此
for/f
输出类似于孤立回车的人工制品,从而产生您遇到的效果;将另一个
for/f
循环放置在内部,因此对每个项目进行双重处理会删除这些人工制品…有一个方法可以绕过那些
wmic
行结尾。虽然我认为,第二个
for
是最通用的方法。是的,@Stephan,但是双
for/f
-循环方法是最简单和最安全的方法,因为它可以处理具有任何特殊字符序列的字符串。。。(我知道您可以查询另一个项目并稍后将其删除,这是同样安全的,但这并不是通用的,因为它仅适用于
/TABLE
输出,而不适用于
/VALUE
输出…)在
for/f
循环中,将另一个
for/f“delims=“%%j in”(%%I”)do
放置在
%j
中,并在
回音中使用
%j
;由于
wmic
返回Unicode输出,而
for/f
不适合处理该输出,因此
for/f
输出类似于孤立回车的人工制品,从而产生您遇到的效果;将另一个
for/f
循环放置在内部,因此对每个项目进行双重处理会删除这些人工制品…有一个方法可以绕过那些
wmic
行结尾。虽然我认为,第二个
for
是最通用的方法。是的,@Stephan,但是双
for/f
-循环方法是最简单和最安全的方法,因为它可以处理具有任何特殊字符序列的字符串。。。(我知道你可以查询另一个项目,稍后将其删除,这是一样安全的,但这并不是通用的,因为它只适用于
/TABLE
输出,而不适用于
/VALUE
输出…)一个被忽略了这么长时间的母版,一个被忽略了这么长时间的母版