我们有一个批处理文件,可以在开发人员设置中安装多个程序.当我们获得使用过的组件的新版本时,会定期运行.因此,只有在版本不同的情况下安装才会很好.
在命令提示符下,我可以运行它并返回安装的版本:
wmic datafile where name='C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe' get version /format:list
Run Code Online (Sandbox Code Playgroud)
这给出了输出Version=12.1.369.0
.
但是,当我把它放入这样的批处理文件并尝试提取版本时:
echo off
FOR /F "tokens=2 delims==" %%I in ('"wmic datafile where^(name^="C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe" get version /format:list"') DO (SET "RESULT=%%I")
ECHO %RESULT%
Run Code Online (Sandbox Code Playgroud)
我得到了答复 \\Common was unexpected at this time.
有些部分可能是多余的,因为我一直试图通过'网络来解决这个问题.
我错过了什么?
你有一套错位的双引号,还有一个额外的(
.
WMIC使用SQL语法,字符串用单引号括起来.内部单引号不会干扰包含单引号的命令.
您可以在WHERE子句(不包括WHERE关键字)周围加上双引号,以避免FOR DO()子句中的某些转义问题.
@echo off
FOR /F "tokens=2 delims==" %%I IN (
'wmic datafile where "name='C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe'" get version /format:list'
) DO SET "RESULT=%%I"
ECHO %RESULT%
Run Code Online (Sandbox Code Playgroud)
但这可能不是整个解决方案.您无法使用上面的代码看到它,但RESULT实际上包含一个尾随回车符(0x0D).这是由于FOR/F如何处理WMIC unicode输出的怪癖.WMIC输出的每一行都有额外的尾随回车.
只要你总是使用%RESULT%
(正常扩展)访问RESULT ,那么你就不会有任何问题.但如果您需要延迟扩展,那么您可能会遇到问题,如下所示.
@echo off
setlocal enableDelayedExpansion
FOR /F "tokens=2 delims==" %%I IN (
'wmic datafile where "name='C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe'" get version /format:list'
) DO SET "RESULT=%%I"
ECHO %RESULT%xxx
ECHO !RESULT!xxx
Run Code Online (Sandbox Code Playgroud)
剥离不需要的回车的一种方便方法是使用额外的FOR级别.
@echo off
setlocal enableDelayedExpansion
FOR /F "tokens=2 delims==" %%I IN (
'wmic datafile where "name='C:\\Program Files (x86)\\Common Files\\Company\\Product\\Version12\\Product.exe'" get version /format:list'
) DO FOR /F "delims=" %%A IN ("%%I") DO SET "RESULT=%%A"
ECHO %RESULT%xxx
ECHO !RESULT!xxx
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31840 次 |
最近记录: |