我需要将WMIC COMPUTERSYSTEM GET MODEL / Value的值设置为变量。当我运行此命令时,我得到以下结果。为什么我会得到额外的空白行?
U:\>for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do set output=%i
:\>set output=
:\>set output=
:\>set output=Model=HP ProDesk 600 G1 SFF
:\>set output=
:\>set output=
:\>set output=
答案 0 :(得分:2)
这是WMIC输出的问题,包含carriage return
个字符
因此,空行不会被删除,因为它们不是完全空的。
回车也负责:>
而不是U:>
的奇怪输出,因为回车首先将光标移动到POS1
,然后空格删除{{1} }}
使用额外的FOR / F,您可以去除回车符
U
顺便说一下。通常,您希望在批处理文件中使用此类表达式,而不是在命令行中 然后你必须将其转换为
for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do @(
for /F "delims=" %X in ("%i") do set output=%X
)
答案 1 :(得分:0)
为什么我会得到额外的空白行?
因为WMIC
在其输出中打印了这些空行,并且"FOR /F processing of a text file consists of reading the file, one line of text at a time and then breaking the line up into individual items"(强调我的)。
因此,即使您没有定义任何delimers,每条线仍然会被单独处理。
如果您在输出中不需要Model=
,则可以使用此功能:
for /f "delims== tokens=2" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do set output=%i
答案 2 :(得分:0)
wmic
命令产生for /F
出现问题的Unicode输出,因此不需要的伪像仍然存在。实际上,这些是孤立的回车符。解决此问题的最佳和最灵活的方法是嵌套另一个for /F
循环,以便解析wmic
输出两次。
以下命令行直接输入控制台,同时显示相应的输出:
U:\>for /F "delims=" %I in ('wmic ComputerSystem GET Model /VALUE') do @for /F "delims=" %L in ("%I") do set "output=%L"
U:\>set "output=Model=HP ProDesk 600 G1 SFF"
U:\>
要在批处理文件中使用上述命令行,您需要将百分号加倍:
@echo off
for /F "delims=" %%I in ('wmic ComputerSystem GET Model /VALUE') do (
for /F "delims=" %%L in ("%%I") do set "output=%%L"
)
echo %output%
要从变量Model=
的值中删除output
前缀,请将脚本更改为:
@echo off
for /F "tokens=1,* delims==" %%I in ('wmic ComputerSystem GET Model /VALUE') do (
for /F "delims=" %%L in ("%%J") do set "output=%%L"
)
echo %output%
双重解析方法实际上归功于dbenham - 请参阅他对Why is the FOR /f loop in this batch script evaluating a blank line?的回答以及他的外部文章WMIC and FOR /F : A fix for the trailing <CR> problem。
答案 3 :(得分:0)
正如其他人已经提到的那样,问题是由于WMIC的Unicode输出。 在您的情况下,您仍然可以使用以下命令将所有内容保存在一行中:
for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value^|findstr /i "MODEL"') do @(set output=%i)