PDA

Показать полную графическую версию : [решено] Поиск и запуск приложения согласно условию If...


semiono
30-12-2009, 21:57
Помогите грамотно и сжато написать скрипт, который попытается запустить приложение согдласно условию...
Например, найти
@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
Примерно так:


$aList = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)("Cubase\Cubase|Cubase 4\Cubase|Cubase\Cubase4|Cubase 4\Cubase4", "|")

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aList[0]
Run (http://www.autoitscript.com/autoit3/docs/functions/Run.htm)(@ProgramFilesDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ProgramFilesDir) & "\" & $aList[$i] & ".exe")
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

Но если этот список может изменяться (например вместо 4 будет другое значение), то нужно будет выполнить поиск и перебор файлов.

Creat0R
05-02-2010, 12:20
semiono, Тема решена?

semiono
11-02-2010, 03:22
Это хорошее решение! Только я с дальнейшими действиями запарился поэтому пока до этого не доходило.
Но вот вернулся, лучше бы это переделать если возможно, чтобы искать только ....Cubase.... & .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
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
Большое спасибо, madmasles!
PPS »
Спасибо ещё больше! :) Очень мне нужная вещь, и может даже ещё пригодиться другим!
У меня скрипту все равно, какие символы и сколько их между 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
semiono,
Ошибка была в коде. Я его поправил. Сейчас у меня находит с пробелами.

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

madmasles
13-02-2010, 01:57
semiono,
Под пробелом я имел в виду Cubase 678.exe. Такой, кстати, тоже находит.

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

semiono
17-02-2010, 00:06
в случае с 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
semiono,
Извините. Я так увлекся поиском, что не проверил скрипт в случае, если файла нет. Я код поправил(в очередной раз :)). Сейчас должен работать.

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

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

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

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

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

semiono
17-02-2010, 23:23
$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
semiono,
Вы напишите в какой последовательности и какие программы должны запускаться.

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

madmasles
17-02-2010, 23:58
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
3. Если нет не того не другого, то что запускаем? »
Тогда ничего не запускаем!
---
Я извиняюсь, наверное цикл не совсем верный, оба приложения открываются.
В конце
Run(@SystemDir & '\Nuendo.cmd', "", @SW_HIDE)
очевидно сработает при любом условии, но даже если закоментировать всёравно что-то не то.

madmasles
18-02-2010, 00:24
semiono,
Вообщем надо две проги запустить...

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




© OSzone.net 2001-2012