Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Поиск и запуск приложения согласно условию If... (http://forum.oszone.net/showthread.php?t=161953)

semiono 30-12-2009 21:57 1307912

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

Creat0R 30-12-2009 22:17 1307928

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

Код:

$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 будет другое значение), то нужно будет выполнить поиск и перебор файлов.

Creat0R 05-02-2010 12:20 1339629

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

semiono 11-02-2010 03:22 1344422

Это хорошее решение! Только я с дальнейшими действиями запарился поэтому пока до этого не доходило.
Но вот вернулся, лучше бы это переделать если возможно, чтобы искать только ....[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 файликов, если не затруднит тоже поправте скрипт, если возможно что-то там упростить?

madmasles 12-02-2010 02:46 1345141

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
Поправил. Теперь и русские буквы отображаются нормально.

semiono 13-02-2010 01:22 1345922

Большое спасибо, 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 инсталяторы бывает, что глючат да ито весьма редко...

madmasles 13-02-2010 01:39 1345928

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

semiono 13-02-2010 01:50 1345931

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

madmasles 13-02-2010 01:57 1345933

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

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

semiono 17-02-2010 00:06 1348998

в случае с 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 - действительно мною переименован, чтоб протестировать батник.

madmasles 17-02-2010 00:19 1349004

semiono,
Извините. Я так увлекся поиском, что не проверил скрипт в случае, если файла нет. Я код поправил(в очередной раз :)). Сейчас должен работать.

semiono 17-02-2010 00:31 1349013

madmasles, во-первых работает, во-вторых очень оперативно! Я уже хотел отказаться от батников,
думал овета не скоро дождусь, так как уже пару дней прошло, видимо ночами работаешь!? :) +1

semiono 17-02-2010 22:56 1349847

Надо усложнить код! Я бы сразу сказал да не думал, что вообще результат будет такой хороший :)

Почему-то не пошло так
$aReturn = _FileSearch(@ProgramFilesDir, StringSplit("Cubase*.exe|Nuendo*.exe","|")) // мои сочинения )))

Вообщем надо две проги запустить, всё одинакого в обоих случаях, третью прогу не надо, две хватит! :)

madmasles 17-02-2010 23:17 1349862

semiono,
Так найдите сначала одну - запустите, потом вторую, третью... и .тд.

semiono 17-02-2010 23:23 1349866

Код:

$aReturn = _FileSearch(@ProgramFilesDir, "Cubase*.exe")
$aReturn = _FileSearch(@ProgramFilesDir, "Nuendo*.exe")

If $aReturn[0] = 0 Then
    Run(@SystemDir & '\Cubase.cmd', "", @SW_HIDE)
    Run(@SystemDir & '\Nuendo.cmd', "", @SW_HIDE)   
Else
    Run($aReturn[1])

Надо так Cubase.exe or Nuendo.exe, одно из двух только

madmasles 17-02-2010 23:37 1349886

semiono,
Вы напишите в какой последовательности и какие программы должны запускаться.

semiono 17-02-2010 23:49 1349894

1 = Cubase.exe 2 = Nuendo.exe, но это не важно, и я переделать смогу
---
я тоже кодю сам тока безрезультатно пока..
If ProcessExists($aReturn) = -1 Then ))))

madmasles 17-02-2010 23:58 1349904

semiono,
Нет, давайте конкретно.
1. Если есть Cubase.exe, то запускается Cubase.exe и выход.
2. Если Cubase.exe нет, то ищем Nuendo.exe, нашли - запускаем и выход.
3. Если нет не того не другого, то что запускаем?

Вот так у меня получилось:
Код:

$aReturnCubase = _FileSearch(@ProgramFilesDir, "Cubase*.exe")
$aReturnNuendo = _FileSearch(@ProgramFilesDir, "Nuendo*.exe")

If $aReturnCubase[0] <> 0 Then
    Run($aReturnCubase[1])
    Exit
ElseIf
$aReturnNuendo[0] <> 0 Then
    Run($aReturnNuendo[1])
    Exit
Else

    MsgBox(0, "", " Не найден ни Cubase*.exe, ни Nuendo*.exe")
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

Если нужна другая последовательность, то меняйте их местами.

Я поправил код.

semiono 18-02-2010 00:09 1349915

Цитата:

Цитата madmasles
3. Если нет не того не другого, то что запускаем? »

Тогда ничего не запускаем!
---
Я извиняюсь, наверное цикл не совсем верный, оба приложения открываются.
В конце
Run(@SystemDir & '\Nuendo.cmd', "", @SW_HIDE)
очевидно сработает при любом условии, но даже если закоментировать всёравно что-то не то.

madmasles 18-02-2010 00:24 1349924

semiono,
Цитата:

Вообщем надо две проги запустить...
Я поправил код.
Нашли Cubase*.exe - запустили его, вышли.
Нет Cubase*.exe, нашли Nuendo*.exe - запустили его, вышли.
Ничего не нашли - сообщили об этом и вышли.


Время: 19:10.

Время: 19:10.
© OSzone.net 2001-