将Variable设置为命令的值

时间:2016-08-03 11:55:04

标签: batch-file cmd

我需要将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=

4 个答案:

答案 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)