【问题标题】:Program version check and update程序版本检查和更新
【发布时间】:2014-09-04 18:39:26
【问题描述】:

此站点包含大量信息,我找到了一些很好的解决方案,但它们都是我需要的部分(无序)。 Adobe 最近为 Acrobat 发布了一个安全修复程序,不幸的是它是一个小补丁,并且还需要以前的补丁版本。 详细信息 - 要更新到 Acrobat 11.0.08,您必须安装 11.0.07。 有些机器有 11.0.06 及以下版本。幸运的是,除了安装 11 的主要版本之外,11.0.07 没有任何先决条件。

我需要做的是检查机器是否有 11.0.07 或 11.0.08。如果没有 7 或 8,则安装 7,然后安装 8。如果已安装 7,则安装 8。如果 8 已经安装,什么也不做。 升级文件位于共享上,需要管理员权限才能安装,因此将在每台需要更新的机器上手动运行。

我一起孵化了以下-

#@echo off
SETLOCAL
cls
rem Installing an update which results in Adobe Reader 11.0.08
echo.
echo.
echo Installing Acrobat Reader 11.0.07 update... please wait...
rem if exist "\\server\share\Logs\%computername%_acrobat_reader_11008.txt" goto gotit
rem Find generates an errorlevel of zero if it encounters a match.
Reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s ^| find  "DisplayName" ^| find "Adobe Acrobat XI Pro" ^| find "DisplayVersion" ^| find "11.0.07"
if %errorlevel% EQU 1 (
goto got7
) ELSE (
goto wrongversion
)
:got7
echo Installing 11.0.08 Update
Reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s ^| find "DisplayName" ^| find "Adobe Acrobat XI Pro" ^| find "DisplayVersion" ^| find "11.0.08"
if %errorlevel% EQU 0 (
goto gotit
) ELSE (
net use q: "\\server\share\Source\patches" /persistent:no 
q:
msiexec /quiet /update Q:\AcrobatSecUpd11008.msp > "\\server\share\Logs\%computername%_acrobat_reader_11008.txt"
goto gotit
)
:wrongversion
Reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s ^|find "DisplayName" ^| find "Adobe Acrobat XI Pro" ^| find "DisplayVersion" ^| find "11.0.08"
if %errorlevel% EQU 0 (
goto gotit
) ELSE (
echo Installing 11.0.07 Update
net use q: "\\server\shareSource\patches" /persistent:no
q:
msiexec /quiet /update Q:\AcrobatUpd11007.msp > "\\server\share\Logs\%computername%_acrobat_reader_11008.txt"
goto got7
)
:gotit
pause

不幸的是,注册表字符串值是分开的。 DisplayName 仅显示“Adobe Acrobat XI Pro”,因此有多个“查找”请求。

【问题讨论】:

  • 所以 - 有问题吗?看来您已经有了解决方案。
  • 它似乎无法正常工作。忽略一些陈述。我已经在 08 版的计算机上对其进行了测试,但它仍然可以进行安装。
  • 您的多个 find 语句并不像您想象的那样工作。带有显示名称的第一个查找将输出类似Adobe Acrobat XI Pro 的文本,第二个查找将输出Adobe Acrobat XI Pro 上的过滤器。最后一次查找只有Adobe Acrobat XI Pro 行作为输入。之前的 find 命令已经过滤掉了其他所有内容。

标签: batch-file find registry updates


【解决方案1】:

您的if %errorlevel% EQU 1 ( 直接与您的 rem 关于 finds 回报相矛盾。我想你的意思是 equ 0 这里。

但无论如何你都不应该使用这个结构,最好使用if errorlevel 1 测试1 或更高

此外,如果您过滤显示名称,您的下一个过滤器将无法很好地从这些结果中找到版本号

按照这些思路应该可以工作:

@ECHO off
SETLOCAL enabledelayedexpansion
for /F "usebackq tokens=*" %%a in (`Reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall /s /f "Adobe Acrobat XI Pro"`) do (
  SET KEY=%%a
  GOTO :next
)
:next
IF NOT "%KEY%" EQU "" (
  FOR /F "usebackq tokens=1,3" %%a in (`Reg query %KEY% /f DisplayVersion`) do (
    IF "%%a" EQU "DisplayVersion" SET VER=%%b
  )
  IF "!VER!" EQU "11.0.07" ECHO found
)

【讨论】:

  • 谢谢你,我会试一试并报告。
  • 我很抱歉,但我在将其注入当前批次时遇到问题。
  • 没关系,不用道歉。
  • 你会建议我如何实现这个?请记住,如果机器有0.07以下的任何版本,则需要安装07补丁然后08。但如果它有07,则只需安装08补丁。
  • 一旦你有了 !VER! 中的版本,我会认为逻辑很简单。如果!VER! EQU 11.0.07 安装 08 等
最近更新 更多