Автоматизировать обновления программного обеспечения из партии
Может кто-нибудь, пожалуйста, помогите мне выяснить код для пакетного файла Windows, который будет смотреть свойства исполняемых файлов или установщиков в каталоге, определять версию установщика и название продукта, сохранять их в переменных и запрашивать установленные продукты. в реестре? Идея заключается в том, что я хотел бы скопировать обновления в папку на машине, которая не имеет подключения к Интернету с диска. Оттуда я хотел бы выполнить командный файл, который просматривает версию и название программного обеспечения, сохраняет их в переменных, а затем запрашивает реестр, чтобы увидеть, установлена ли предыдущая версия. Итак, если я скачал install_flash_player_ax.exe, он должен знать, чтобы искать в реестре Adobe FlashPlayer. Если версия в исполняемом файле новее, чем версия в реестре, будет произведена тихая установка.
Любая помощь или предложения будут с благодарностью!
1 ответ
Хотя это старый вопрос, я постараюсь на него ответить, так как он может быть полезен для других. Командная оболочка Windows не имеет прямого способа получить метаданные файла, такие как версия, но вы можете использовать для нее wmic. Основная проблема заключается в том, что отображаемое имя программного обеспечения может отличаться в свойствах exe-файла установки / обновления и от имени в реестре. Поэтому плохая идея брать имя из метаданных файла и запрашивать его во всем кусте реестра HKLM. Кроме того, если у вас нет предопределенного списка программного обеспечения, подлежащего обновлению, и вы не знаете точный путь в реестре, где хранится версия для каждого из них, идея сделать цикл по списку exe, чтобы получить имена из их метаданных Я тоже плохо.
Итак, лучший способ найти это - создать скрипт для каждого exe-файла отдельно и добавить их в планировщик Windows. Вот пример необходимого пакетного скрипта для автоматизации обновлений для Adobe Flash Player для 64-битной ОС:
@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-ботных ОС и HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ для 32-битных.
Следовательно, вам нужно найти путь для каждой установки, которая вам нужна. Обратите внимание, что {EE56217C-B3F9-402B-B4EC-63F090F51D3D} в моем сценарии является GUID для данной версии Flash Player 19.
Вот то же самое в 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"
}