批量自动化软件更新
Posted
技术标签:
【中文标题】批量自动化软件更新【英文标题】:Automate Software Updates from batch 【发布时间】:2013-05-19 03:30:20 【问题描述】:谁能帮我找出 Windows 批处理文件的代码,它将查看目录中可执行文件或安装程序的属性,确定安装程序的版本和产品的名称,将它们存储在变量中,然后查询反对在注册表中安装的产品?这个想法是我想将更新复制到没有从磁盘连接互联网的机器上的文件夹。从那里我想执行一个批处理文件,查看软件的版本和名称,将它们存储在变量中,然后查询注册表以查看是否安装了以前的版本。所以,如果我下载了 install_flash_player_ax.exe,它应该知道在注册表中查找 adobe flashplayer。如果可执行文件上的版本比注册表中的版本新,它将执行静默安装。
任何帮助或建议将不胜感激!
【问题讨论】:
【参考方案1】:虽然这是一个老问题,但我会尝试回答它,因为它可能对其他人有用。 Windows 命令外壳没有直接的方法来获取文件元数据(如版本),但您可以使用 wmic 来获取它。 主要问题是软件的显示名称在安装/更新exe文件的属性中可能与注册表中的显示名称不同。因此,从文件元数据中获取名称并在整个 HKLM 注册表配置单元中查询它是一个坏主意。 此外,如果您没有要更新的软件的预定义列表,并且不知道注册表中存储每个软件版本的确切路径,则可以循环查看 exe 列表以从其元数据中获取名称id也不好。
因此,最好的搜索方法是为每个 exe 分别制作一个脚本并将它们添加到 Windows 调度程序中。 以下是为 64 位操作系统自动更新 Adobe Flash Player 所需的批处理脚本示例:
@echo off
for /f %%a in ('wmic datafile where name^="C:\\Users\\username\\Downloads\\install_flash_player_19_active_x.exe" get version ^| find /n /v "" ^| findstr "^\[2\]"') do set var=%%a
for /f "tokens=2 delims=]" %%a in ("%var%") do set prver=%%a
echo Available version: %prver%
for /f "tokens=3" %%a in ('reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\EE56217C-B3F9-402B-B4EC-63F090F51D3D" /v DisplayVersion') do set regversion=%%a
echo Installed version: %regversion%
if %prver% == %regversion% (echo The newest version %regversion% installed) else (echo Update required & "C:\Users\username\Downloads\install_flash_player_19_active_x.exe")
更新文件位于某个本地文件夹中,在我的情况下为 C:\Users\username\Downloads\install_flash_player_19_active_x.exe。安装程序时,它们会在 HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ 用于 64-bot 操作系统和 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ 用于 32 位。
因此,您需要为所需的每个安装找到路径。请注意,我的脚本中的 EE56217C-B3F9-402B-B4EC-63F090F51D3D 是给定 Flash Player 19 版本的 GUID。
在 PowerShell 中也一样,更优雅:
$filever = (Get-Item "C:\Users\username\Downloads\install_flash_player_19_active_x.exe").versioninfo.fileversion
$appname = (Get-Item "C:\Users\username\Downloads\install_flash_player_19_active_x.exe").versioninfo.internalname
$regpath = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\EE56217C-B3F9-402B-B4EC-63F090F51D3D"
$regversion = Get-ItemProperty $regpath -Name "DisplayVersion" | select -ExpandProperty "DisplayVersion"
if ($winrarreg -eq $regversion)
"The newest version of Flash Player $regpath is already installed"
else
"Current installed version is:" + $regversion
"Available version is:" + $filever
"Let's update Flash Player"
Start-Process -FilePath "C:\Users\username\Downloads\install_flash_player_19_active_x.exe"
【讨论】:
以上是关于批量自动化软件更新的主要内容,如果未能解决你的问题,请参考以下文章
Linux环境一键自动化安装oracle软件的构想(附shell脚本)