2014-06-10 49 views
0

我试图复制在Stackoverflow上的这个问题的其他答案中使用的方法,但没有人为我工作。我曾尝试:如何使用Windows批处理将文本文件内容读入变量?

@echo off 
wmic product where name="BMNIA" get Name, Version>tmp.txt 
type tmp.txt 
REM setlocal ENABLEDELAYEDEXPANSION 
REM for /f "delims=" %%x in (tmp.txt) do set ver=%%x 
set /p ver=<tmp.txt 
echo ver: %ver% 
REM endlocal 

同时使用重定向方法和for循环的方法,但每个返回如下:

Name Version 
BMNIA 1.1.1.4 
ver: 

类型命令显示脚本能够读取文件内容,但由于某种原因,ver仍然是空的。任何人都可以看到我做错了什么?

回答

0

试试这样说:

@echo off 
setlocal enableextensions enabledelayedexpansion 
set PRODUCTNAME=BMNIA 
set VER= 
for /f "skip=1 delims=" %%p in ('wmic product where name^="%PRODUCTNAME%" get Version 2^> NULL') do (
    set VER=%%p 
    if {!VER!} NEQ {} goto :BREAK 
) 
:BREAK 
echo %VER% 
endlocal 

如果未安装该产品,VER是空的。如果有多个匹配项,则VER将包含wmic.exe输出的第一个实例的版本号。

+0

工作。非常感谢你!我没有意识到有必要跳过一条线。我认为文件读取会持续到结束。我也没有理解(仍然没有)wmic命令的输出需要被重定向到NULL。 – Don

+0

@Don不会将输出重定向,而是将错误重定向到NUL。尝试一个不存在的产品名称,你会明白为什么它是有道理的。 – Stephan

0
@echo off 
set ver=not installed 
for /f "tokens=2 delims==" %%p in ('wmic product where name^="BMNIA" get Version /value 2^>nul') do set ver=%%p 
echo ver: %ver% 

set ver=not installed 
for /f "tokens=2 delims==" %%p in ('wmic product where name^="whatever" get Version /value 2^>nul') do set ver=%%p 
echo ver: %ver% 
+0

对于这样的查询,你不需要'find'命令。由于您正在使用'='作为分隔符并只询问第二个标记,'%% p'只会填充用'='符号分隔两个元素的行。如果未填充'%% p',则'do'子句中的代码不会被执行,即该行被忽略,因为它没有填充任何请求的令牌。 –

+0

@MCND:你说得对。我习惯于用'find',所以我从来没有想过要这样做。 – Stephan

相关问题