【问题标题】:wmic output to file without addtional line issuewmic 输出到文件而没有额外的行问题
【发布时间】:2020-07-29 12:35:45
【问题描述】:

我查看了所有这些主题和帖子:

线程:https://superuser.com/questions/1082530/how-can-i-remove-the-last-blank-line-of-a-wmic-command

线程:How can I remove empty lines from wmic output?

线程:Parsing WMIC output

发帖:https://stackoverflow.com/a/37725658/8262102

到目前为止,没有任何帮助,他们中的大多数使用findstr /r /v "^$" 来执行此操作。

它们的问题在于,在我的情况下,输出在写入文件时包含额外的一行。

我想要的文件输出应该是:

[Microsoft Windows 10 Pro]

但我得到了:

[Microsoft Windows 10 Pro
]

这是我的代码,它将在您的桌面上创建输出文件:

@echo off
Setlocal EnableDelayedExpansion
cd /d "C:\Users\%username%\Desktop"
(
  for /f "skip=1 delims=" %%A in (
    'wmic OS get Caption ^| findstr /r /v "^$"'
    ) do echo [%%A]
  )>output.txt && exit

任何帮助将不胜感激。

【问题讨论】:

    标签: batch-file cmd wmic


    【解决方案1】:

    最简单的解决办法是改变的输出格式:

        For /F Tokens^=6Delims^=^" %%A In (
            '"%__AppDir__%wbem\WMIC.exe" OS Get Caption /Format:MOF'
        ) Do Echo [%%A]
    

    上面的答案对所提出的问题有效,即从一个特定值返回字符串结果。根据您的附加信息,它不再有效,但这不是代码的错,而是您无法提出正确的问题。

    对于您正在寻找的具体值,它们是 ManufacturerNameDescriptionCurrentClockSpeedNumberOfCoresNumberOfLogicalProcessors,我会建议使用完全不同的方法,使用 @ 987654322@:

    $c = GCIM "Win32_Processor"
    $o = ForEach ($i in $c) {
        "Manufacturer:                 " + $i.Manufacturer
        "Name:                         " + $i.Name
        "Description:                  " + $i.Description
        "Current Clock Speed:          " + $([Math]::Round($i.CurrentClockSpeed/1000,2)) + " GHz"
        "Number Of Cores:              " + $i.NumberOfCores
        "Number Of Logical Processors: " + $i.NumberOfLogicalProcessors
    }
    $o | Out-File ".\CPUInfo.txt"
    

    为了使用 标签保持主题,这是一个完整的,它利用

    @"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP ^
      "$c = GCIM 'Win32_Processor';" ^
      "$o = ForEach ($i in $c) {" ^
        "\"Manufacturer:                 \" + $i.Manufacturer;" ^
        "\"Name:                         \" + $i.Name;" ^
        "\"Description:                  \" + $i.Description;" ^
        "\"Current Clock Speed:          \" + $([Math]::Round($i.CurrentClockSpeed/1000,2)) + \" GHz\";" ^
        "\"Number Of Cores:              \" + $i.NumberOfCores;" ^
        "\"Number Of Logical Processors: \" + $i.NumberOfLogicalProcessors};" ^
      "$o | Out-File \".\CPUInfo.txt\""
    

    【讨论】:

    • 非常感谢。这正是我所追求的。当wmic 做同样的事情时,%__AppDir__%wbem\WMIC.exe 有什么理由吗?
    • 我在wmic CPU get NumberOfCores 之后遇到了一些障碍,因为该值没有用" 分隔,所以我不得不回复@Hackoos 的答案。我一定会记住这个答案。再次感谢您抽出宝贵时间提供帮助。
    • @Ste,在回答您的评论时,WMIC 仅在 %PATH%%PATHEXT% 的内容没有被错误修改且不存在任何人应该承担的风险的情况下才起作用接受他们的生产脚本。我已经更新了我的答案,但请理解我的答案对于您提出的问题是绝对正确的,接受它,然后当它对您未提出的另一个问题无效时改变主意是不公平的。我更新的答案应该以单个命令的形式提供您想要的所有内容,而您当前的方法使用六个 WMIC 命令来获得所需的输出。
    • 我将再次将其标记为 anwser,因为它将涵盖所有基础。我不是故意让你不高兴,但是当我问这个问题或使用你的答案时,我不知道输出中有不同的分隔符。你所给予的已经足够了,所以谢谢你。
    【解决方案2】:

    WMIC 的输出是 unicode !

    可以通过另一个 FOR /F 循环传递值来删除尾随 <CR>

    这也删除了幻象“空白”行(实际上是<CR>

    @echo off
    for /f "skip=1 delims=" %%a in ('"wmic OS get Caption"') do (
        for /f "delims=" %%b in ("%%a") do set "MyVAR=%%~nb"
    )
    echo [%MyVAR%]
    pause
    

    【讨论】:

    • 不确定出了什么问题,但变量 %os% 已保留并导致 Windows_NT。如果我将该变量名称更改为其他名称,它将不起作用。
    • 谢谢,这行得通,但首先我需要Setlocal EnableDelayedExpansion,然后是echo [!MyVAR!],而不是echo [%MyVAR%]。只有当我按照我的问题包装了代码时:( your code with those changes above )>output.txt
    【解决方案3】:

    我最终使用了@Hackoos 的解决方案,因为它允许获取诸如 wmic CPU get NumberOfCores 之类的值,但 Compos 的出色答案失败了,因为该值与它的值没有相同的分隔符,所以我已经修改用于可重用函数的 Hackoos 代码,如下所示:

    @echo off
    cd /d "C:\Users\%username%\Desktop"
    set WMICGET_VALUE=
    (
    
      call :WMICGET_ECHO CPU Manufacturer              "  Manufacturer:                  "
      call :WMICGET_ECHO CPU Name                      "  Name:                          "
      call :WMICGET_ECHO CPU Description               "  Description:                   "
      call :WMICGET_ECHO CPU CurrentClockSpeed         "">nul
      Setlocal EnableDelayedExpansion
      echo   Current Clock Speed:            !WMICGET_VALUE! Mhz / !WMICGET_VALUE:~0,1!.!WMICGET_VALUE:~1,2! GHz
      endlocal
      call :WMICGET_ECHO CPU NumberOfCores             "  Number Of Cores:               "
      call :WMICGET_ECHO CPU NumberOfLogicalProcessors "  Number Of Logical Processors:  "
    
      exit
    
    rem Based on this answer: https://stackoverflow.com/a/63153964/8262102
    :WMICGET_ECHO
    for /f "skip=1 delims=" %%a in ('"wmic %1 get %2"') do (for /f "delims=" %%b in ("%%a") do echo %~3 %%~nb & set "WMICGET_VALUE=%%~nb")
    goto :EOF
    )>output.txt
    

    【讨论】:

    • Ste,我也会在这里特别说明这一点,因为您在上面的答案文本中强调了我的解决方案失败。 我的解决方案没有使您提出的问题失败,您更改了问题。你问的问题是检索一个字符串,特别是Win32_OperatingSystem 下的Caption 的值,你甚至提供了你需要的确切输出。您在这里的答案是从完全不同的类Win32_Processor 中检索字符串和整数。请不要问问题,然后更改它们并呼叫没有猜到您的问题内容是假的响应者!
    • 这里没有答案是错误的。我觉得你想多了。使用您的答案或提出问题时,我没有预见到问题。到目前为止,Hackoo 提供的解决方案适用于所有情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2021-10-06
    相关资源
    最近更新 更多