为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

狐的传说 2019-11-20 10:44:06
在批处理文件中,我正在使用以下内容检查Baseboard信息:BaseboardCheck.cmd@echo offsetlocal enabledelayedexpansionfor /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        )    )   )上面的问题:当回显出来时,变量将被覆盖,而不是附加。输出:DX79SIThis overwrites the variableAAG28808-600This overwrites the variable我想要得到的是:DX79SIDX79SIThis overwrites the variableAAG28808-600AAG28808-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%.
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超3个赞

是的,您有问题,但这不是您的想法。


wmic 具有特殊的行为:在每行输出的末尾有一个附加的回车符,即每行以 0x0d 0x0d 0x0a


这个附加的回车符存储在变量中,当回显到控制台时,您将获得数据和回车符,因此,如果变量后面跟有更多文本,则将光标定位在行的开头(回车),此文本将在先前回显的数据之上回显。


怎么解决?


@echo off

setlocal enabledelayedexpansion


for /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命令删除附加回车符


查看完整回答
反对 回复 2019-11-20
?
慕的地10843

TA贡献1785条经验 获得超8个赞

正如已经回答的那样,问题出在的行尾wmic。


如果不使用行尾,则可以解决此问题:wmic baseboard get Product,Version,Width使用三个标记:Product,Version和Width(在大多数情况下为empy)。因此输出将是:DX79SI,AAG28808-600,我们正在使用令牌1和令牌2,而忽略令牌3(这将有问题)


set Platform=undefined

set BaseboardVersion=undefined


for /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)


查看完整回答
反对 回复 2019-11-20
  • 3 回答
  • 0 关注
  • 575 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信