亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

解析輸出時如何更正變量覆蓋行為

解析輸出時如何更正變量覆蓋行為

狐的傳說 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條經驗 獲得超4個贊

是的,您有問題,但這不是您的想法。


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 關注
  • 647 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號