如何在Windows批处理文件中使用WMIC将DLL或EXE的文件版本获取到变量?

如何在Windows批处理文件中使用WMIC将DLL或EXE的文件版本获取到变量?,windows,batch-file,wmic,Windows,Batch File,Wmic,我尝试使用Windows批处理文件获取文件版本。此命令成功地将版本打印到控制台 WMIC DATAFILE WHERE name="Z:\\bin\\My_project.dll" get Version /format:Textvaluelist 但是,当我尝试使用以下方法将此输出获取到变量时,Windows命令处理器会输出: Z:\\bin\\My_project.dll-无效的别名动词 这个命令行有什么问题 for /f %%a in ('WMIC DATAFILE WHERE name

我尝试使用Windows批处理文件获取文件版本。此命令成功地将版本打印到控制台

WMIC DATAFILE WHERE name="Z:\\bin\\My_project.dll" get Version /format:Textvaluelist
但是,当我尝试使用以下方法将此输出获取到变量时,Windows命令处理器会输出:

Z:\\bin\\My_project.dll-无效的别名动词

这个命令行有什么问题

for /f %%a in ('WMIC DATAFILE WHERE name="Z:\\bin\\My_project.dll" get Version /format:Textvaluelist') do set val=%%a

这就是我使用WMIC尝试执行此任务的方式:

For/F“Tokens=1*Delims==”%%A In(
'WMIC数据文件,其中“Name='Z:\\bin\\My_project.dll'”获取版本/值2^>Nul'
)Do For/F“令牌=*”%%C In(“%%B”)Do Set“val=%%C”
第二个
For
循环旨在克服unicode
WMIC
结果产生的不需要的输出


编辑

如果未规定
WMIC
,您可以从批处理文件中使用
VBScript

for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe DATAFILE WHERE name^="Z:\\bin\\My_project.dll" get Version /VALUE 2^>nul') do set "val=%%I"
for /F "usebackq tokens=2 delims==" %%I in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE WHERE "name='Z:\\bin\\My_project.dll'" GET Version /VALUE 2^>nul`) do set "val=%%I"
使用Windows脚本主机:


WScript.Echo CreateObject(“Scripting.FileSystemObject”).GetFileVersion(“Z:\bin\My_project.dll”)
或者通过
mshta.exe

@Echo关闭
对于/F%%A英寸('
MsHTA VBScript:Execute(“Set o=CreateObject”(“Scripting.FileSystemObject”):o.GetStandardStream(1)。Write(o.GetFileVersion(““Z:\bin\My_project.dll”):Close“^)
“)是否设置“val=%%A”
设置val 2>Nul
暂停

这是我使用
WMIC
尝试执行此任务的方式:

For/F“Tokens=1*Delims==”%%A In(
'WMIC数据文件,其中“Name='Z:\\bin\\My_project.dll'”获取版本/值2^>Nul'
)Do For/F“令牌=*”%%C In(“%%B”)Do Set“val=%%C”
第二个
For
循环旨在克服unicode
WMIC
结果产生的不需要的输出


编辑

如果未规定
WMIC
,您可以从批处理文件中使用
VBScript

for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe DATAFILE WHERE name^="Z:\\bin\\My_project.dll" get Version /VALUE 2^>nul') do set "val=%%I"
for /F "usebackq tokens=2 delims==" %%I in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE WHERE "name='Z:\\bin\\My_project.dll'" GET Version /VALUE 2^>nul`) do set "val=%%I"
使用Windows脚本主机:


WScript.Echo CreateObject(“Scripting.FileSystemObject”).GetFileVersion(“Z:\bin\My_project.dll”)
或者通过
mshta.exe

@Echo关闭
对于/F%%A英寸('
MsHTA VBScript:Execute(“Set o=CreateObject”(“Scripting.FileSystemObject”):o.GetStandardStream(1)。Write(o.GetFileVersion(““Z:\bin\My_project.dll”):Close“^)
“)是否设置“val=%%A”
设置val 2>Nul
暂停

问题是在
where
子句中的等号,它被
cmd
视为标准的标记分隔符,就像空格、制表符、
、垂直选项卡(code
0x0B
)、表单馈送(code
0x0C
)和非中断空间(code
0xFF

for/F
命令执行要在单独的
cmd
实例中解析的命令,但在此之前,标准令牌分隔符的每个序列都将被单个空格替换。因此,
=
也被替换,这留下了一些奇怪的语法

要真正保留
=
-符号,您需要像
^=
一样对其进行转义。另一种方法是更改报价样式,以便
=
显示在
之间,方法是在
wmic数据文件中声明“Name='Z:\\bin\\My\u project.dll'”获取版本

但这仍然不能提供预期的结果,因为
wmic
返回Unicode输出,这会留下一些令人不安的转换工件,如孤立的回车字符。这可以通过嵌套另一个
for/F
循环来避免

此外,由于您选择的输出格式,您还将获得
Version=
前缀,这可能不是您希望包含的内容。这可以通过为
for/F
定义合适的
标记和
delims
选项来改变

所有这些项目都会产生如下代码:

for /F "usebackq delims=" %%a in (`
    wmic DataFile where "Name='Z:\\bin\\My_project.dll'" get Version /VALUE
`) do for /F "tokens=1* delims==" %%b in ("%%a") do set "val=%%c"

这将从返回的版本中删除任何前导的
=
-符号(如果有的话)。

问题是在
where
子句中的等于符号,它被
cmd
视为标准的令牌分隔符,就像空格、制表符、
、垂直选项卡(code
0x0B
)、表单馈送(code
0x0C
)和非中断空间(code
0xFF

for/F
命令执行要在单独的
cmd
实例中解析的命令,但在此之前,标准令牌分隔符的每个序列都将被单个空格替换。因此,
=
也被替换,这留下了一些奇怪的语法

要真正保留
=
-符号,您需要像
^=
一样对其进行转义。另一种方法是更改报价样式,以便
=
显示在
之间,方法是在
wmic数据文件中声明“Name='Z:\\bin\\My\u project.dll'”获取版本

但这仍然不能提供预期的结果,因为
wmic
返回Unicode输出,这会留下一些令人不安的转换工件,如孤立的回车字符。这可以通过嵌套另一个
for/F
循环来避免

此外,由于您选择的输出格式,您还将获得
Version=
前缀,这可能不是您希望包含的内容。这可以通过为
for/F
定义合适的
标记和
delims
选项来改变

所有这些项目都会产生如下代码:

for /F "usebackq delims=" %%a in (`
    wmic DataFile where "Name='Z:\\bin\\My_project.dll'" get Version /VALUE
`) do for /F "tokens=1* delims==" %%b in ("%%a") do set "val=%%c"

这将从返回的版本(如果有)中删除任何前导符号。

获取DLL版本的最简单解决方案是在批处理文件中使用以下命令行:

for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe DATAFILE WHERE name^="Z:\\bin\\My_project.dll" get Version /VALUE 2^>nul') do set "val=%%I"
for /F "usebackq tokens=2 delims==" %%I in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE WHERE "name='Z:\\bin\\My_project.dll'" GET Version /VALUE 2^>nul`) do set "val=%%I"
批处理文件中的命令行也可能略有不同:

for /F "tokens=2 delims==" %%I in ('%SystemRoot%\System32\wbem\wmic.exe DATAFILE WHERE name^="Z:\\bin\\My_project.dll" get Version /VALUE 2^>nul') do set "val=%%I"
for /F "usebackq tokens=2 delims==" %%I in (`%SystemRoot%\System32\wbem\wmic.exe DATAFILE WHERE "name='Z:\\bin\\My_project.dll'" GET Version /VALUE 2^>nul`) do set "val=%%I"
FOR使用从后台的
%ComSpec%/c
开始的单独命令过程运行圆括号中的命令,并捕获输出到STDO的所有行