Batch file 将变量设置为命令的值
我需要将WMIC COMPUTERSYSTEM GET MODEL/value的值设置为变量。当我运行这个命令时,我得到以下结果。为什么我会得到额外的空行Batch file 将变量设置为命令的值,batch-file,cmd,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
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=
为什么我会得到额外的空行
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=
因为WMIC
在其输出中打印那些空行,并且(强调我的)
因此,即使您没有定义任何delimers,每一行仍然是单独处理的
如果输出中不需要该Model=
,可以使用以下方法:
对于/f“delims==tokens=2”%i in('WMIC COMPUTERSYSTEM GET MODEL/Value')是否设置输出=%i
这是WMIC输出的问题,它包含回车
字符。因此,空行不会被删除,因为它们不是完全空的 回车符还负责
:>
的奇怪输出,而不是U:>
,因为回车符首先将光标移动到POS1
,然后空格删除U
使用额外的FOR/F,可以去掉回车符
for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do @(
for /F "delims=" %X in ("%i") do set output=%X
)
顺便说一句,通常您希望在批处理文件中,而不是在命令行中使用这样的表达式。然后你必须把它转换成
@echo off
for /f "delims=" %%i in ('WMIC COMPUTERSYSTEM GET MODEL /Value') do (
for /F "delims=" %%X in ("%%i") do set output=%%X
)
wmic
命令生成Unicode输出,该输出对于/F有问题,因此不需要的人工制品仍然存在。事实上,这些是孤立的回车字符。克服此问题的最佳且最灵活的方法是嵌套另一个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%
要从变量output
的值中去掉Model=
前缀,请将脚本更改为:
@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%
实际上,双重解析方法的功劳在于——参见他的答案和他的外部文章。正如其他人已经提到的,这个问题是由于WMIC的Unicode输出造成的。 在您的情况下,您仍然可以使用以下命令将所有内容保持在一行上:
for /f "delims=" %i in ('WMIC COMPUTERSYSTEM GET MODEL /Value^|findstr /i "MODEL"') do @(set output=%i)
我尝试了“do set output=%output%%I”,但它没有设置我得到的值U:\>echo%output%%output%U:\>echo%output%%I%output%%i@JohnRing这是另一个问题,它与空行无关,你应该修改你的问题使之更准确,我相信问题是由于WMIC在UTF-8中输出,而内部命令需要ANSI。很多关于SO的帖子都提到了这个话题。也就是说,@jeb的解决方案工作得很好。是的,你是对的,输出是UTF-8,这导致了回车问题,因为字节是
00cr00lf
而不是crlf
@jeb,我认为输出中缺少的驱动器号U
是复制和粘贴错误,这就是为什么我(仓促地)插入它们的原因;控制台上的真实输出通常也会在每个相邻回波之间包含空行;无论如何,我要求OP向我们展示真实的输出…@aschipfl我在编辑之前对它进行了测试,因为我起初也认为他只是错过了U:>
,但我错了啊,是的,@jeb,似乎每一行都以回车和空格结尾。。。