Как проверить наличие исполняемого файла и запустить установщик, если приложение не установлено?

Я системный администратор серверной / клиентской среды, в которой нет SCCM, и я хочу проверить, есть ли у компьютеров в моей организации имя файла, используя пакетный файл.

Я хочу, чтобы сценарий проверял, находится ли файл egui.exe в одном из этих каталогов:

Program Files\ESET\ESET Security\
Program Files (86)\ESET\ESET Security\

Если файл СУЩЕСТВУЕТ, то скрипт должен ничего не делать.
Если файл НЕТ СУЩЕСТВУЕТ, то он должен начать установку Конечная точка Eset в Тихий режим с моего сервера:

msiexec /i myserver\eea_nt64_enu.msi /qb 

Я что-то написал, но не уверен, правильно ли и полно:

If exist "C:\program files\ESET\ESET Security\egui.exe" echo ?
else 
call msiexec /i myserver\eea_nt64_enu.msi /qb

Опять же, я не хочу, чтобы сценарий загружал установку, если файл существует. Если исполняемый файл существует в этой папке, командный файл не должен делать ничего.

Как проверить наличие исполняемого файла в Программные файлы и Программные файлы (x86)?

Как проверить, какая у каждого версия?

Если версия AntiVirus старая (скажем, версия 4), она должна заставить ее установить И заменить текущую версию?

Бьюсь об заклад, если вы прочитаете файл справки для команды IF, вы увидите, каков правильный синтаксис для использования ELSE.

Squashman 11.04.2018 14:41

Ну не нахожу. Кроме того, не могу найти, как заставить его ничего не делать, если файл существует.

StackBuck 11.04.2018 15:20

@StackBuck, нетрудно найти справку по конкретной команде, открыть командную строку, cmd.exe, в окне набрать command /? и нажать клавишу ввода. В этом случае вы должны ввести if /? для получения информации о команде If.

Compo 11.04.2018 15:42

ОК. Как заставить скрипт «ничего не делать», если файл существует?

StackBuck 11.04.2018 15:48

Почему бы не использовать IF NOT EXIST? stackoverflow.com/questions/6780553/…

Adam Leinss 11.04.2018 15:50

Спасибо, Адам! Пожалуйста, подумайте, сделайте это как ответ, поэтому я приму и проголосую!

StackBuck 11.04.2018 15:51

@StackBuck, вы серьезно не можете увидеть пример синтаксиса в файле справки для команды IF. Это именно то, что вам нужно.

Squashman 11.04.2018 15:55
1
7
3 350
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я полагаю, вы убедились, что рассматриваемый MSI не решает эту «проблему» самостоятельно? Может быть, у него есть необходимая логика для очистки встроенных в него старых версий, чтобы вам не нужно было выполнять какие-либо проверки предварительных условий?

Я вижу, что вы получили пакетный ответ (IF NOT EXIST), но я хочу добавить, что вы можете решить эту проблему, используя устаревшие активные сценарии (VBScript, Javascript - я вижу, вы можете быть человеком Javascript) или более современные сценарии Powershell (которые я не используйте много).

Можем ли мы спросить, как вы запускаете установку? Через скрипт входа в систему, запланированные задачи, AD или какой-то другой механизм?

Я немного разбираюсь в сценариях Powershell, но по вашему вопросу я планирую сделать это через сценарий входа в систему.

StackBuck 11.04.2018 15:59

Хорошо, Powershell - это не мое, но вот хороший источник: github.com/heaths/psmsi (вероятно, вам известен). А если вы еще этого не сделали, возможно, просто запустите установку прямо в системе с уже существующим файлом и посмотрите, что произойдет. Вероятно, вы уже это сделали.

Stein Åsmul 11.04.2018 16:06
Ответ принят как подходящий

Откройте окно командной строки и запустите if /? и goto /?, чтобы понять следующий командный файл:

@echo off

rem This first file existence check works on 32-bit and
rem 64-bit Windows in 32-bit and 64-bit environment.
if exist "%ProgramFiles%\ESET\ESET Security\egui.exe" goto :EOF

rem On 64-bit Windows run also a file existence check for 32-bit version
rem of application in standard program files folder for x86 applications.
if not "%ProgramFiles(x86)%" == "" if exist "%ProgramFiles(x86)%\ESET\ESET Security\egui.exe" goto :EOF

rem If this batch file is executed by 32-bit cmd.exe on 64-bit Windows
rem there is still not checked if 64-bit version of application exists
rem in standard program files folder for x64 applications.
if not "%ProgramW6432%" == "" if exist "%ProgramW6432%\ESET\ESET Security\egui.exe" goto :EOF

rem Other commands to install the application depending on Windows architecture.

Прочтите статью Microsoft Подробности реализации WOW64, чтобы узнать причину всех этих условий ЕСЛИ.

Но я полагаю, что было бы лучше проверить наличие egui.exe, запросив ключ реестра регистрация приложения этого приложения, установленного с помощью пакета установщика Microsoft.

@echo off
%SystemRoot%\System32\reg.exe QUERY "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\egui.exe" >nul 2>&1
if not errorlevel 1 goto :EOF

rem Other commands to install the application depending on Windows architecture.

REG завершается со значением 1, если указанный раздел реестра не существует, и со значением 0 при успешном запросе этого раздела реестра.

if not errorlevel 1 означает, что код выхода ранее выполненной команды / приложения - не больше или равно1, что означает ниже чем1, что означает, что почти для всех команд и приложений это равный0.

У меня не установлен пакет ESET Безопасность, поэтому я не знаю, зарегистрирован ли egui.exe (или любой другой исполняемый файл из этого пакета) в соответствии с рекомендациями Microsoft по регистрации приложений Windows.

Чтобы понять все используемые команды и то, как они работают, откройте окно командной строки, выполните следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • echo /?
  • goto /?
  • if /?
  • reg /?
  • reg query /?
  • rem /?

Другие вопросы по теме