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命令删除附加回车符
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)
- 3 回答
- 0 关注
- 621 浏览
添加回答
举报