Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск и запуск приложения согласно условию If...

Ответить
Настройки темы
[решено] Поиск и запуск приложения согласно условию If...

Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Помогите грамотно и сжато написать скрипт, который попытается запустить приложение согдласно условию...
Например, найти
@ProgramFiles\Cubase\Cubase.exe или
@ProgramFiles\Cubase 4\Cubase.exe или
@ProgramFiles\Cubase\Cubase4.exe или
@ProgramFiles\Cubase 4\Cubase4.exe
если error=1 то продолжить работу скрипта.... ну или Exit
При первом совпадении нужно выйти из "цикла", чтобы не сработало дважды...
То-есть, нашёл, запустил, и продолжил далее скрипт...
Хотя гуру, конечно могут посоветовать regexp парисногом искать часть имени, я не против, это даже лучше!
Пожалуйста не придирайтесь, я действительно не шарю в логических построениях... Мне очень надо!

-------
Полезное сообщение


Отправлено: 21:57, 30-12-2009

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Примерно так:

Код: Выделить весь код
$aList = StringSplit("Cubase\Cubase|Cubase 4\Cubase|Cubase\Cubase4|Cubase 4\Cubase4", "|")

For $i = 1 To $aList[0]
    Run(@ProgramFilesDir & "\" & $aList[$i] & ".exe")
    If Not @error Then ExitLoop
Next
Но если этот список может изменяться (например вместо 4 будет другое значение), то нужно будет выполнить поиск и перебор файлов.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:17, 30-12-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


semiono, Тема решена?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 12:20, 05-02-2010 | #3


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Это хорошее решение! Только я с дальнейшими действиями запарился поэтому пока до этого не доходило.
Но вот вернулся, лучше бы это переделать если возможно, чтобы искать только ....[test]Cubase[/test].... & .exe
Ато вариантов многовато может быть относительно первого поста, имя же файла всегда точно определено,
если отсечь (пробел)4.exe и путь C:\~..\..\
Я вдобавок хотел бы чтобы в случае ненахождения батник запускался, обычно у меня в system32 лежит
одноимённый батник system32\cubase.cmd который так же запустит приложение.
Поэтому, очень хотелось бы чтобы расширение exe и cmd поддерживались одновременно.
Но скрипт так же должен завершиться при запуске первого совпадения.

Я вот тут взял скриптик для поиска, правда для другой цели, чуть исправил...
http://forum.oszone.ru/thread-166317.html
Код: Выделить весь код
$path = @ScriptDir & "\Plugins"
$sFile = FileList($path, "*.inf")

If $sFile[0]>0 Then
        For $i=1 To $sFile[0]
                Run('rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 132 ' & $sFile[$i])
        Next
EndIf

Func FileList($sPath, $inFilter = '*', $exFilter = '');$includeFilter='*.txt,*.htm'  $excludeFilter='www,asp,desktop'
        $sPath = StringRegExpReplace($sPath, '\\+$', '')
        Local $aRetArray[1], $sFindNextFile, $sCurrentPath, $iFL
        Global $FolderList[2]
        $aRetArray[0] = 0
        $FolderList[0] = 1
        $FolderList[1] = $sPath
        Local $sFindFirstFile = FileFindFirstFile($sPath & "\*")
        If @error = 1 Then Return SetError(1, 0, -1)
        #Region
        If StringRight($inFilter, 1) = ',' Then $inFilter = StringTrimRight($inFilter, 1)
        $inFilter = StringReplace($inFilter, '^', '\^')
        $inFilter = StringReplace($inFilter, '.', '\.')
        $inFilter = StringReplace($inFilter, '(', '\(')
        $inFilter = StringReplace($inFilter, ')', '\)')
        $inFilter = StringReplace($inFilter, '[', '\[')
        $inFilter = StringReplace($inFilter, ']', '\]')
        $inFilter = StringReplace($inFilter, '+', '\+')
        $inFilter = StringReplace($inFilter, '$', '\$')
        $inFilter = StringReplace($inFilter, '*', '.*')
        $inFilter = '(?i)^' & StringReplace($inFilter, ',', '$|^') & '$'
        If StringInStr($exFilter, ',') > 0 And $exFilter <> '' Then
                If StringRight($exFilter, 1) = ',' Then $exFilter = StringTrimRight($exFilter, 1)
                $exFilter = StringReplace($exFilter, ',', '|')
                $exFilter = StringReplace($exFilter, '.', '\.')
                $exFilter = StringReplace($exFilter, '(', '\(')
                $exFilter = StringReplace($exFilter, ')', '\)')
                $exFilter = StringReplace($exFilter, '[', '\[')
                $exFilter = StringReplace($exFilter, ']', '\]')
                $exFilter = StringReplace($exFilter, '+', '\+')
                $exFilter = StringReplace($exFilter, '$', '\$')
                $exFilter = '(?i)(' & StringReplace($exFilter, '^', '\^') & ')'
        EndIf
        #EndRegion
        $iFL = 1
        Do
                $sFindFirstFile = FileFindFirstFile($FolderList[$iFL] & "\*")
                If @error = 0 Then
                        While 1
                                $sFindNextFile = FileFindNextFile($sFindFirstFile)
                                If @error = 1 Then ExitLoop
                                $sCurrentPath = $FolderList[$iFL] & "\" & $sFindNextFile
                                If StringInStr(FileGetAttrib($sCurrentPath), "D") Then;папка
                                        $FolderList[0] += 1
                                        If UBound($FolderList) < $FolderList[0] + 1 Then ReDim $FolderList[$FolderList[0] + 1000]
                                        $FolderList[$FolderList[0]] = $sCurrentPath
                                Else;файл
                                        If StringRegExp($sFindNextFile, $inFilter) = 1 And ($exFilter = '' Or StringRegExp($sFindNextFile, $exFilter) = 0) Then
                                                $aRetArray[0] += 1
                                                If UBound($aRetArray) < $aRetArray[0] + 1 Then ReDim $aRetArray[$aRetArray[0] + 1000]
                                                $aRetArray[$aRetArray[0]] = $sCurrentPath
                                        EndIf
                                EndIf
                        WEnd
                EndIf
                FileClose($sFindFirstFile)
                $iFL += 1
        Until $iFL > $FolderList[0]
        ReDim $aRetArray[$aRetArray[0] + 1]
        ReDim $FolderList[$FolderList[0] + 1]
        Return $aRetArray
	EndFunc  ;==>FileList
Однако, не знаю, слишком огромный скрипт для простой задачи, нельзя ли его упростить?
И в данном случае применить для запуска Cubase 4.exe который надо найти на диске и запустить?

PS для inf файликов, если не затруднит тоже поправте скрипт, если возможно что-то там упростить?

-------
Полезное сообщение


Последний раз редактировалось semiono, 11-02-2010 в 03:32.


Отправлено: 03:22, 11-02-2010 | #4


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


semiono,
У меня так получилось:
Код: Выделить весь код
$aReturn = _FileSearch(@ProgramFilesDir, "Cubase*.exe")
If $aReturn[0] = 0 Then
    Run(@SystemDir & '\Install.cmd', "", @SW_HIDE)
Else
    Run($aReturn[1])
EndIf
Exit

Func _FileSearch($sPath, $sFileMask)
    Local $sOut = StringToBinary("0" & @CRLF, 2), $aOut
    Local $hDir = Run(@ComSpec & ' /U/C DIR "' & $sPath & '\' & $sFileMask & '" /S/B/A-D', @SystemDir, @SW_HIDE, 6)

    While 1
        $sOut &= StdoutRead($hDir, False, True)
        If @error Then ExitLoop
    WEnd

    $aOut = StringRegExp(BinaryToString($sOut, 2), "[^\r\n]+", 3)
    If @error Then Return SetError(1)

    $aOut[0] = UBound($aOut) - 1
    Return $aOut
EndFunc   ;==>_FileSearch
У меня скрипт находит любой Cubase.exe (т.е Cubase.exe, Cubase0.exe, Cubase1.exe , ..., Cubase9.exe). Если находит, запускает первый, который нашел, если не находит, запускает system32\cubase.cmd. Если надо искать не только в Program Files, а на диске, то @ProgramFilesDir поменяйте на @HomeDrive.

PS
Попробовал добавить к цифре в имени Cubase1.exe еще цифры и буквы(только латинские). У меня скрипту все равно, какие символы и сколько их между Cubase и .exe, он все равно его находит и запускает.

PPS
Поправил. Теперь и русские буквы отображаются нормально.

Последний раз редактировалось madmasles, 17-02-2010 в 00:17.

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:46, 12-02-2010 | #5


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Большое спасибо, madmasles!
Цитата madmasles:
PPS »
Спасибо ещё больше! Очень мне нужная вещь, и может даже ещё пригодиться другим!
Цитата madmasles:
У меня скрипту все равно, какие символы и сколько их между Cubase и .exe, он все равно его находит и запускает. »
Надеюсь что так любимые девелоперами пробелы тоже учитываются Cubase 1.exe ! Надо будет проверить...

Забавно что у меня никак не работает вообще, ищу ошибку пока...
Так тоже не работает:
$aReturn = _FileSearch(@ProgramFilesDir, "\Cubase*.exe")
$aReturn = _FileSearch(@ProgramFilesDir, "\Cubase\Cubase*.exe")
кстати это так должно быть:
Run(@SystemDir & '\Cubase.cmd', "", @SW_HIDE)

Причём и батник лежит @SystemDir & "\Cubase.cmd"
и в реестре прописано HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Cubase.exe
и прога просто названа @ProgramFilesDir & "\Cubase\Cubase.exe"
и тишина

У меня папка @Program Files находится внутри @WindowsDir, но никогда проблем не было, тем более что у меня FAT32.
Правда msi инсталяторы бывает, что глючат да ито весьма редко...

-------
Полезное сообщение


Последний раз редактировалось semiono, 13-02-2010 в 01:45.


Отправлено: 01:22, 13-02-2010 | #6


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


semiono,
Ошибка была в коде. Я его поправил. Сейчас у меня находит с пробелами.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:39, 13-02-2010 | #7


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


Вау, у меня пошло! Интересно где тогда пробел был? У меня нету пробелов в системе
Но зато работает пока первый тест!

-------
Полезное сообщение


Отправлено: 01:50, 13-02-2010 | #8


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


semiono,
Под пробелом я имел в виду Cubase 678.exe. Такой, кстати, тоже находит.

PS
Я Вам советую организовать дополнительную проверку имени Cubase*.exe или самого файла, например по версии или еще как-нибудь, так как функция находит любые exe-шники начинающиеся с Cubase.... То есть если первым найдет, например, какой-нибудь cubasease.exe, то его и запустит.

Последний раз редактировалось madmasles, 13-02-2010 в 18:07.


Отправлено: 01:57, 13-02-2010 | #9


Аватара для semiono

Ветеран


Сообщения: 842
Благодарности: 33

Профиль | Отправить PM | Цитировать


в случае с Cubase.cmd какая-то проблемма!

Код: Выделить весь код
If $aReturn[1]="" Then
If ^ ERROR

Error: Array variable has incorrect number of subscripts or subscript dimenition range exceeded.
Содержимое пакетного файла такое:
Код: Выделить весь код
@if "%1"=="-r" shutdown -r -f -t 00 & goto sh
@start C:\I\Apps\Cubase\zzCubase.exe %*
:sh
zzCubase.exe - действительно мною переименован, чтоб протестировать батник.

-------
Полезное сообщение


Отправлено: 00:06, 17-02-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Поиск и запуск приложения согласно условию If...

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Как организовать поиск нужного диска и запуск с него приложения? Nun-Nun Скриптовые языки администрирования Windows 16 28-05-2009 22:12
Прочие - удалённый запуск/завершение приложения danya_rus Программное обеспечение Windows 0 27-05-2009 18:48
Запуск терминального приложения Rulezzz2 Microsoft Windows NT/2000/2003 2 11-03-2009 16:00
Интерфейс - [решено] Поиск файлов из приложения bofi Microsoft Windows 2000/XP 2 06-10-2008 18:37
запуск DOS приложения Pupil Microsoft Windows 2000/XP 8 29-12-2003 12:42




 
Переход