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

时间:2014-08-29 17:07:25

标签: batch-file command-line-arguments

我正在尝试编写一个批处理文件来检查程序版本,看它是否需要升级。问题是某些版本无法正常升级,因此如果它在某个版本范围之间,则需要先卸载然后重新安装才能升级。我试图从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

2 个答案:

答案 0 :(得分:1)

嗯,这里有一些问题。首先,您不能在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命令的输出循环,跳过前两行,只查看第三行的第二个分隔值(使用=和空格)作为可能的分界符)。

同样在命令本身中,您必须转义双引号和等号,并通过在它们前面加上^插入符来完成。如果您在64位操作系统上运行它并且您的阅读器在

  

Program Files (x86)

那么你也必须逃避这些括号,如

  

Program Files ^(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 /?以获取其他比较运算符。

答案 1 :(得分:0)

@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