Batch file 批处理文件,用于检查程序版本以查看是否应升级

Batch file 批处理文件,用于检查程序版本以查看是否应升级,batch-file,command-line-arguments,Batch File,Command Line Arguments,我正试图编写一个批处理文件来检查程序版本,看看是否需要升级。问题是,某些版本无法正确升级,因此,如果在某个版本范围内,则需要卸载该版本,然后在升级之前重新安装。我正在尝试将WMIC命令的返回作为一个变量,用于与当前版本进行比较。我不确定这是否是最有效的处理方法。 代码不完整,因为我还没有让它工作,但到目前为止我得到的是: set latestVersion=11.0.0.8 set currentVersion=('wmic datafile where name="D:\\Pr

我正试图编写一个批处理文件来检查程序版本,看看是否需要升级。问题是,某些版本无法正确升级,因此,如果在某个版本范围内,则需要卸载该版本,然后在升级之前重新安装。我正在尝试将WMIC命令的返回作为一个变量,用于与当前版本进行比较。我不确定这是否是最有效的处理方法。 代码不完整,因为我还没有让它工作,但到目前为止我得到的是:

    set latestVersion=11.0.0.8
    set currentVersion=('wmic datafile where name="D:\\Program Files\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe"' get version)

    if %currentVersion%=%latestVersion% goto noUpdate
    if %currentVersion%>='11.0.0.3' goto reinstall
    if %currentVersion%<='11.0.0.2' goto update
设置最新版本=11.0.0.8
设置currentVersion=('wmic数据文件,其中name=“D:\\Program Files\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe”'获取版本)
如果%currentVersion%=%latestVersion%goto noUpdate
如果%currentVersion%>='11.0.0.3'转到重新安装

如果%currentVersion%好的话,这里有一些问题。首先,不能在SET语句中直接使用命令的结果;您必须使用FOR循环,例如,在您的情况下:

for /f "skip=2 tokens=2 delims== " %%i in ('wmic datafile where name^=^"D:\\Program Files\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe^" get version /value') do set currentversion=%%i
然后可以在比较中使用%currentversion%。但是,您将无法像在这里所做的那样使用比较运算符。对于等式,您使用一个双等于==对于其他两个,您将使用GEQ和LEQ。此外,您不会在值周围使用引号,因为这不是wmic的结果,也不会在运算符的两侧使用引号。另一个问题是,您正在比较可能具有不同长度的字符串,除非您控制它,在这种批比较中,4.1.0.1大于11.2.5.7。如果这是一个问题,您可能希望切换到类似VBScript的东西,在那里您可以更好地控制

FOR行有点复杂,但基本上是通过wmic命令的输出循环,跳过前两行,只查看第三行的第二个分隔值(使用=和空格作为可能的delimeters)

此外,在命令本身中,您必须转义双引号和等号,这是通过在它们前面加上^caret字符来完成的。如果您在64位操作系统上运行它,并且您的读卡器处于

程序文件(x86)

然后你也必须把那些括号转义,就像在

程序文件^(x86^)

因此,在所有这些话之后,这里是您的代码的固定版本(尽管未经过精确测试,因为我的AcroRD32.exe与您的不一样,但这让我想起了(x86)的事情),正如您所说,它现在除了抱怨缺少标签之外什么也做不了,但这应该会让您继续:

set latestVersion=11.0.0.8
for /f "skip=2 tokens=2 delims== " %%i in ('wmic datafile where name^=^"D:\\Program Files\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe^" get version /value') do set currentversion=%%i

if %currentVersion%==%latestVersion% goto noUpdate
if %currentVersion% GEQ 11.0.0.3 goto reinstall
if %currentVersion% LEQ 11.0.0.2 goto update

请在命令行中引用
if/?
,以获取其他比较运算符。

非常感谢您的回复。你的解释清楚明了,最重要的是,是正确的。我试图做一个for循环,但失败了;现在我明白为什么了。再次感谢!
@ECHO off
   set latestVersion=11.0.0.8
   set minVersion=11.0.0.3
   for /f "tokens=1,2,3,4 delims=." %%A in ("%latestVersion%") do set numirized_version=%%A%%B%%C%%D
   echo %numirized_version%
      for /f "tokens=1,2,3,4 delims=." %%A in ("%minVersion%") do set min_numirized_version=%%A%%B%%C%%D
   echo %min_numirized_version%
   for /f "usebackq tokens=2,3,4,5 delims=,." %%a in (`"wmic datafile where name='D:\\Program Files\\Adobe\\Reader 11.0\\Reader\\AcroRd32.exe' get version /format:csv"`) do (
        set ver=%%a%%b%%c%%d
    )

    if 1%ver% EQU 1%numirized_version% goto :no_update
    if 1%ver% LSS 1%min_numirized_version% goto :reinstall
    if 1%ver% GEQ 1%min_numirized_version% if if 1%ver% LSS 1%numirized_version% goto :update