Skipping last empty line of WMIC command output in batch

五迷三道 提交于 2019-12-25 07:26:03

问题


I am trying to format the output of a command in JSON as such:

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 }

Everything is fine until I hit the end of the list of patches where it reads the line after the last patch and then prints "".

How can I make it stop when it is supposed to?

If possible, I would like to avoid using text files.


回答1:


Inside the for /f loop, place another one:

for /f "skip=1" %%i in ('%patches%') do for /f "delims=" %%j in ("%%i") do (
    rem // use `%%j` in the loop body
)

The wmic command returns Unicode output. Since for /f is not perfect for handling such, it produces artefacts like orphaned carriage-returns (CR), leading to the effect you encounter (the last line does not appear empty to your for /f %%i loop as it contains such a CR; remember that for /f skips lines that are really empty). Placing another for /f loop inside and hence double-processing each item removes such artefacts.

Here is the fixed script:

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 }

Since I did not get the purpose of the call command, I simply removed it.


The double-parsing method is actually credited to dbenham -- see his answer to Why is the FOR /f loop in this batch script evaluating a blank line? and also his external article WMIC and FOR /F : A fix for the trailing <CR> problem.




回答2:


Skipping last empty line of WMIC command output in batch

The simplest solution is to use findstr to remove the blank lines:

for /f "skip=1" %%i in ('%patches% ^| findstr /r /v "^$"')

No extra for loop required.


Further Reading

  • An A-Z Index of the Windows CMD command line - An excellent reference for all things Windows cmd line related.
  • findstr - Search for strings in files.


来源:https://stackoverflow.com/questions/37706454/skipping-last-empty-line-of-wmic-command-output-in-batch

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!