如何在Windows批处理文件中使用WMIC将DLL或EXE的文件版本获取到变量?
我尝试使用Windows批处理文件获取文件版本。此命令成功地将版本打印到控制台如何在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
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
循环旨在克服unicodeWMIC
结果产生的不需要的输出
编辑 如果未规定
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
循环旨在克服unicodeWMIC
结果产生的不需要的输出
编辑 如果未规定
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
视为标准的标记分隔符,就像空格、制表符、、、
、垂直选项卡(code0x0B
)、表单馈送(code0x0C
)和非中断空间(code0xFF
)
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
视为标准的令牌分隔符,就像空格、制表符、、、
、垂直选项卡(code0x0B
)、表单馈送(code0x0C
)和非中断空间(code0xFF
)
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的所有行