【问题标题】:batch file for checking program version to see if it should be upgraded用于检查程序版本以查看是否应升级的批处理文件
【发布时间】:2014-10-23 17:47:02
【问题描述】:

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

【问题讨论】:

    标签: batch-file command-line-arguments


    【解决方案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 /? 以获取其他比较运算符。

    【讨论】:

    • 非常感谢您的回复。你的解释清晰简洁,最重要的是,正确。我曾试图做一个 for 循环,但失败了;现在我明白为什么了。再次感谢!
    【解决方案2】:
    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-31
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多