【问题标题】:Get the result of a WMIC command and store it in a variable获取 WMIC 命令的结果并将其存储在变量中
【发布时间】:2017-01-09 04:35:32
【问题描述】:

我见过一些批处理脚本以这种方式工作,包括stackoverflow。

我的问题很简单:为什么 MEM 部分不起作用?

@echo OFF

SET CPU="$CPU"

echo CPU: %NUMBER_OF_PROCESSORS%

FOR /F "delims=" %%i IN ('wmic computersystem get TotalPhysicalMemory') DO set MEM=%%i

echo MEM: %MEM%

【问题讨论】:

  • 请详细说明“不工作”!我认为您遇到了由for /F 输出的wmic 的Unicode 到ANSI 转换导致的问题,这会留下干扰正确文本解析的孤立回车字符;看看这篇文章以获得解决方案:Parsing the output of wmic in shell script.

标签: batch-file scripting wmic


【解决方案1】:

你可以用For / Do这样的循环格式化WMIC的输出:

@echo off
Call :GetTotalPhysicalMemory
echo TotalPhysicalMemory = %MEM% & pause
exit
::***********************************************
:GetTotalPhysicalMemory
for /f "tokens=2 delims==" %%a in ('
    wmic computersystem get TotalPhysicalMemory /value
') do for /f "delims=" %%b in ("%%a") do (
    Set "MEM=%%b" 
)
exit /b
::***********************************************

【讨论】:

    【解决方案2】:

    这很简单。 wmic computersystem get TotalPhysicalMemory 输出三行文字:

    TotalPhysicalMemory
    12867309568
    <blank line>
    

    所以你的 for 循环进行了三次迭代。在第一个 MEM 设置为 TotalPhysicalMemory,在第二个设置为 12867309568 最后它变成了 .所以你的输出是空的。

    这很丑,但会解决你的问题:

    @echo OFF
    setlocal enabledelayedexpansion
    SET CPU="$CPU"
    echo CPU: %NUMBER_OF_PROCESSORS%
    FOR /F "delims= skip=1" %%i IN ('wmic computersystem get TotalPhysicalMemory') DO (
        set MEM=%%i
        goto STOP
    
    )
    :STOP
    echo MEM: !MEM!
    

    skip=1 将忽略 TotalPhysicalMemorygoto STOP 将在第一次迭代后中断循环。

    【讨论】:

    • 实际上,该命令已被编辑以简化问题。目的是:'wmic computersystem get TotalPhysicalMemory | findstr -v "Total"' 我的脚本结果(在 4 个服务器上测试): G:\>get_numphycpu.bat CPU: 6 MEM:
    • 顺便谢谢你的回答。它奏效了,我明白为什么:)
    • @DavidLago 你也可以通过For / Do循环格式化WMIC的输出来检查我的答案
    • 第三行绝对是not空的,因为for /F会被跳过,但该行包含一个孤立的回车符;另外两行也可能附加回车符;在没有临时文件的情况下摆脱这些字符的唯一可靠的方法是使用两个嵌套的for /F 循环,如以下帖子所示:Text garble in batch script for wmic command、@987654322 @ 和 Hackoo's answer 在这里。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2020-08-14
    • 2018-06-27
    • 2022-10-19
    • 1970-01-01
    • 2013-01-12
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多