解析输出时如何更正变量覆盖行为

在批处理文件中,我正在使用以下内容检查Baseboard信息:

BaseboardCheck.cmd


@echo off

setlocal enabledelayedexpansion


for /f "tokens=1,2* delims==" %%a in ('wmic baseboard get /format:list') DO ( 


    if ["%%a"] EQU ["Product"] (

        set PlatformInfo=%%b


        if defined PlatformInfo (

            echo.!PlatformInfo!

            echo.!PlatformInfo!This overwrites the variable

        )

    )


    if ["%%a"] EQU ["Version"] (

        set BaseboardVersion=%%b


        if defined BaseboardVersion (

            echo.!BaseboardVersion!

            echo.!BaseboardVersion!This overwrites the variable

        )

    )   

)

上面的问题:当回显出来时,变量将被覆盖,而不是附加。

输出:


DX79SI

This overwrites the variable

AAG28808-600

This overwrites the variable

我想要得到的是:


DX79SI

DX79SIThis overwrites the variable

AAG28808-600

AAG28808-600This overwrites the variable

我已经花了几个小时(并将继续这样做),但希望其他人遇到了这个问题。并希望其他任何遇到此解析问题的人都可以在将来避免这种情况。



由此产生的另一个问题是,它似乎破坏了条件逻辑。


更新

在获得所有帮助之后,我想出了以下解决方案:


for /f "skip=2 tokens=1,2 delims=," %%a in ('wmic baseboard get Product^,Version^,Width /format:csv') do (


    set Platform=%%a

    set BaseboardVersion=%%b

)

echo.Platform: %Platform% 

echo.Version %BaseboardVersion%.


狐的传说
浏览 580回答 3
3回答

浮云间

是的,您有问题,但这不是您的想法。wmic 具有特殊的行为:在每行输出的末尾有一个附加的回车符,即每行以 0x0d 0x0d 0x0a这个附加的回车符存储在变量中,当回显到控制台时,您将获得数据和回车符,因此,如果变量后面跟有更多文本,则将光标定位在行的开头(回车),此文本将在先前回显的数据之上回显。怎么解决?@echo offsetlocal enabledelayedexpansionfor /f "tokens=1,* delims==" %%a in ('wmic baseboard get /format:list') DO (     if ["%%a"] EQU ["Product"] (        for /f "delims=" %%c in ("%%b") do set "PlatformInfo=%%c"        if defined PlatformInfo (            echo(!PlatformInfo!            echo(!PlatformInfo!This does not overwrite the variable        )    )    if ["%%a"] EQU ["Version"] (        for /f "delims=" %%c in ("%%b") do set "BaseboardVersion=%%c"        if defined BaseboardVersion (            echo(!BaseboardVersion!            echo(!BaseboardVersion!This does not overwrite the variable        )    )   )在这种情况下,可以在不更改代码逻辑的情况下使用附加for /f命令删除附加回车符

慕的地10843

正如已经回答的那样,问题出在的行尾wmic。如果不使用行尾,则可以解决此问题:wmic baseboard get Product,Version,Width使用三个标记:Product,Version和Width(在大多数情况下为empy)。因此输出将是:DX79SI,AAG28808-600,我们正在使用令牌1和令牌2,而忽略令牌3(这将有问题)set Platform=undefinedset BaseboardVersion=undefinedfor /f "tokens=1,2 delims=," %%a in ('wmic baseboard get Product^,Version^,Width^|findstr "."') do ( set Platform=%%a set BaseboardVersion=%%b)echo it is a %Platform% with Version %BaseboardVersion%. No overwriting我还添加delims=,了万一字符串包含空格的情况(不太可能出现product)
打开App,查看更多内容
随时随地看视频慕课网APP