Автор Тема: Запустить программу, не зная пути к файлу  (Прочитано 376 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн ЭйчЭйч [?]

  • Сообщений: 119
  • Репутация: -6
    • Награды
  • Версия AutoIt: 3.3.14.0
Нужно запустить программу, которая не идет по умолчанию с Windows и не у всех на компьютере есть. Известно имя файла program.exe, однако, так как путь к нему и названия папой могут быть пользовательскими, указать его напрямую нельзя. Известно также, что при установке программа следит (запись в реестре, ярлыки).

Что и как использовать для того, чтобы реализовать:
1. Проверку "установлена ли программа".
2. Запуск программы.
 

Русское сообщество AutoIt

Запустить программу, не зная пути к файлу
« Отправлен: Март 19, 2019, 04:45:53 »

Оффлайн Torotin [?]

  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 2
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Правильно ли я понимаю, что программа проходит пользовательский процесс инсталляции ПО через Windows Installer и т.п.?

Отправлено с моего SM-N950F через Tapatalk


Оффлайн ЭйчЭйч [?]

  • Сообщений: 119

  • Автор темы
  • Репутация: -6
    • Награды
  • Версия AutoIt: 3.3.14.0
Правильно ли я понимаю, что программа проходит пользовательский процесс инсталляции ПО через Windows Installer и т.п.?
Программа либо уже установлена или не установлена. Как я уже записал, ярлыки и записи в реестре установщиком создаются.

Можно, конечно, заставить пользователя указать на каталог и файл. Однако, хочется избавить пользователя от лишних действий. Я еще вижу вариант - в реестре найти. Иных коротких путей я не знаю.
Хотя, вот ещё. Процесс может быть уже запущен. Как-то можно выдернуть оттуда путь к файлу?

Русское сообщество AutoIt

Re: Запустить программу, не зная пути к файлу
« Ответ #2 Отправлен: Март 19, 2019, 11:11:47 »

Оффлайн joiner [?]

  • Расмус-бродяга
  • Модератор
  • *
  • Сообщений: 2963
  • Репутация: 495
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
все есть на форуме. и поиск по реестру и по запущенному процессу
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн Torotin [?]

  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 2
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
Как я уже записал, ярлыки и записи в реестре установщиком создаются.

Для стандартно установленных программ, которые прописывают себя в реестре я использую представленную ниже конструкцию.
Немного кривовато, но для моих целей этого хватает.
Посмотрите, может Вам чем-то поможет.

Код: AutoIt [Выделить]
Func _ProgInfo($Program, $Action = "Version")

    Local $RegRoot, $RegKey, $ProgVer, $ProgName, $UninstallStrRead, $UninstallStr, $pNotInstall
    $RegRoot = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    If $Action = "" Then $Action = "Version"

    For $i = 1 To 999
        $RegKey = RegEnumKey($RegRoot, $i)
        If @error Then ExitLoop
        $ProgName = RegRead($RegRoot & "\" & $RegKey, "DisplayName")
        If $Program = $ProgName Then
            ConsoleWrite("Find " & $Program & " OK")
            ExitLoop
        EndIf
    Next


    If $Program = $ProgName Then
        Switch $Action
            Case "Delete"
                $UninstallStrRead = RegRead($RegRoot & "\" & $RegKey, "UninstallString")
                $MsiExec = StringRegExp($UninstallStrRead, "(MsiExec.exe)(.*)")
                If $MsiExec <> 0 Then
                    $UninstallStr = StringRegExpReplace($UninstallStrRead, "(.*)(/I)(.*)", "$1 /x $3 /passive")
                    ConsoleWrite(@ComSpec & " /c " & $UninstallStr)
                    RunWait(@ComSpec & " /c " & $UninstallStr, '', @SW_HIDE)
                Else
                    ConsoleWrite(@ComSpec & " /c " & $UninstallStrRead)
                    RunWait(@ComSpec & ' /c "' & $UninstallStrRead & '"', '', @SW_HIDE)
                EndIf
            Case "Version"
                $ProgVer = RegRead($RegRoot & "\" & $RegKey, "DisplayVersion")
                ConsoleWrite($ProgName & " version: " & $ProgVer)
                Return $ProgVer
        EndSwitch
    Else
        $pNotInstall = "NO installed"
        ConsoleWrite($Program & " " & $pNotInstall)
        Return $pNotInstall
    EndIf
EndFunc
 


Русское сообщество AutoIt

Re: Запустить программу, не зная пути к файлу
« Ответ #4 Отправлен: Март 19, 2019, 11:55:12 »

Оффлайн ЭйчЭйч [?]

  • Сообщений: 119

  • Автор темы
  • Репутация: -6
    • Награды
  • Версия AutoIt: 3.3.14.0
Крутая конструция, вытаскивает всё.

Я обошёлся:

Код: AutoIt [Выделить]
$sSoftTitle = 'MySoft'
$sRegPath = 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\' & $sSoftName
$aPath = StringRegExp(RegRead($sRegPath, 'DisplayIcon'), '(.*?)u', 1)
If IsArray($aPath) Then
   $sPath = $aPath[0]
Else
; предложить иной путь
EndIf
 

Мне кажется, что я с регулярным накосячил. Возвращается путь C:\Folder0\Folder1\MySoft\uninstaller.exe, где uninstaller.exe мне нужно отбросить. Также меня смущает Wow6432Node, я думаю, что на Windows XP такого нет. То есть, метод накроется медным тазом.

Оффлайн Torotin [?]

  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 2
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Мне кажется, что я с регулярным накосячил. Возвращается путь C:\Folder0\Folder1\MySoft\uninstaller.exe, где uninstaller.exe мне нужно отбросить.

Можно посмотреть в этой теме Деление пути к файлу на части

Также меня смущает Wow6432Node, я думаю, что на Windows XP такого нет. То есть, метод накроется медным тазом.

По умолчанию редактор реестра 64-разрядных версий Windows отображает 32-разрядные разделы в разделе [HKEY_LOCAL_MACHINE\Software\WOW6432Node]
Можно попробовать пойти через уже существующие макросы и делать ветвление в зависимости от установленной ОС и её разрядности.

Код: AutoIt [Выделить]
@OSArch ; Возвращает одно из следующих значений: "X86", "IA64", "X64" - это тип архитектуры запущенной операционной системы
@OSVersion  ;Возвращает одно из следующих значений: "WIN_2008R2", "WIN_7", "WIN_8", "WIN_2008", "WIN_VISTA", "WIN_2003", "WIN_XP", "WIN_XPe", "WIN_2000"
 


Оффлайн joiner [?]

  • Расмус-бродяга
  • Модератор
  • *
  • Сообщений: 2963
  • Репутация: 495
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
(нажмите для показа/скрытия)
выдает в массив название программ и директория установки
найти в массиве методом сравнения по имени и запустить экзешник. если, конечно же, он лежит в корне)

Русское сообщество AutoIt

Re: Запустить программу, не зная пути к файлу
« Ответ #7 Отправлен: Март 19, 2019, 16:29:36 »

Оффлайн ЭйчЭйч [?]

  • Сообщений: 119

  • Автор темы
  • Репутация: -6
    • Награды
  • Версия AutoIt: 3.3.14.0
Torotin, я посмотрел ветку на Windows 7x64
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallВ ней можно найти что угодно, кроме той программы, что я ищу. Поэтому имей ввиду, что не универсальная вещь. Это для какой ОС вариант?

Да, можно ветвление сделать. Однако, на мой взгляд проще будет обработать ошибку и перейти к другому разделу.


Оффлайн Torotin [?]

  • Новичок
  • *
  • Сообщений: 10
  • Репутация: 2
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Torotin, я посмотрел ветку на Windows 7x64
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallВ ней можно найти что угодно, кроме той программы, что я ищу. Поэтому имей ввиду, что не универсальная вещь. Это для какой ОС вариант?

Да, можно ветвление сделать. Однако, на мой взгляд проще будет обработать ошибку и перейти к другому разделу.

Код писался для Win7Pro x86.
Скажу больше:
1) в исходных данных разговор о х64 ветке реестра не шёл.
2) всю необходимую информацию касаемо "подгонки" исходника под свои нужды были предоставлены и их можно найти здесь на форуме.

Отправлено с моего SM-N950F через Tapatalk

Оффлайн ЭйчЭйч [?]

  • Сообщений: 119

  • Автор темы
  • Репутация: -6
    • Награды
  • Версия AutoIt: 3.3.14.0
Torotin, это не претензия к коду, а интерес. Подогнать - не вопрос.

Русское сообщество AutoIt

Re: Запустить программу, не зная пути к файлу
« Ответ #10 Отправлен: Март 20, 2019, 00:09:53 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
11 Ответов
13659 Просмотров
Последний ответ Март 22, 2019, 22:29:11
от CreatoR
3 Ответов
3594 Просмотров
Последний ответ Декабрь 23, 2011, 14:07:30
от AZJIO
2 Ответов
2685 Просмотров
Последний ответ Май 04, 2012, 10:19:09
от vitaliy4us
0 Ответов
980 Просмотров
Последний ответ Апрель 28, 2014, 23:18:47
от gora
5 Ответов
1830 Просмотров
Последний ответ Октябрь 07, 2014, 22:03:44
от saraconor
0 Ответов
995 Просмотров
Последний ответ Август 27, 2015, 03:17:03
от CreatoR
2 Ответов
1317 Просмотров
Последний ответ Декабрь 11, 2015, 16:57:33
от amai
2 Ответов
4257 Просмотров
Последний ответ Декабрь 24, 2015, 18:55:08
от Майор
22 Ответов
4730 Просмотров
Последний ответ Март 09, 2016, 01:05:50
от Alofa
20 Ответов
1458 Просмотров
Последний ответ Июнь 22, 2018, 03:08:34
от Vanguger