Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 将变量设置为命令的值_Batch File_Cmd - Fatal编程技术网

Batch file 将变量设置为命令的值

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

我需要将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=
为什么我会得到额外的空行

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,似乎每一行都以回车和空格结尾。。。