Что нового

Формирование массива из файла txt и запуск по наличию слова в Title

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
Здравствуйте, форумчане.
Я обращаюсь к вам за помощью.

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

Но есть ряд неудобств.
Часто бывает, когда несколько разных окон - имеют один и тот же процесс.
Также тяжело прописывать адреса скриптов - в строку, поскольку их слишком много (слишком длинная получается строка). И намного удобнее брать адреса запускаемых скриптов из txt.


В связи с этим возникает два вопроса.
Как формировать массив
Код:
Global $aProgs[][] = [['calc.exe', 0, 'F:\-склад команд\1.au3'], ['cmd.exe', 0, 'F:\-склад команд\2.au3'], ['notepad.exe', 0, 'F:\-склад команд\2.au3']]

- не в строке кода, а брать его из txt ?
Как заставить скрипт реагировать не на названия процессов, а на наличие конкретного слова внутри Title ?

Скрипт сейчас выглядит так:
Код:
#include <file.au3>

Global $aProgs[][] = [['calc.exe', 0, 'F:\-склад команд\1.au3'], ['cmd.exe', 0, 'F:\-склад команд\2.au3'], ['notepad.exe', 0, 'F:\-склад команд\2.au3']]

While Sleep(10)
    For $i = 0 To UBound($aProgs) - 1
        If $aProgs[$i][1] = 0 And ProcessExists($aProgs[$i][0]) Then
            $aProgs[$i][1] = 1
            _Action($aProgs[$i][2])
        ElseIf $aProgs[$i][1] = 1 And Not ProcessExists($aProgs[$i][0]) Then
            $aProgs[$i][1] = 0
        EndIf
    Next
WEnd

Func _Action($sProg)
    ;MsgBox(64, @ScriptName, $sProg)
    ShellExecute($sProg)
EndFunc


Список адресов в txt - такой:
calc.exe
F:\-склад команд\1.au3

cmd.exe
F:\-склад команд\2.au3

notepad.exe
F:\-склад команд\2.au3
 

Вложения

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
222
Как по мне - было бы удобнее хранить список адресов не в txt, а в ini файле, например в таком виде :
Код:
[calc.exe]
path=F:\-склад команд\1.au3

[cmd.exe]
path=F:\-склад команд\2.au3

[notepad.exe]
path=F:\-склад команд\2.au3
тогда Ваш скрипт может быть в таком виде:
Код:
#include <file.au3>

;Global $aProgs[][] = [['calc.exe', 0, 'F:\-склад команд\1.au3'], ['cmd.exe', 0, 'F:\-склад команд\2.au3'], ['notepad.exe', 0, 'F:\-склад команд\2.au3']]
Global $IniFile = @ScriptDir & '\Data.ini'

Global $aProgs = IniReadSectionNames($IniFile)
If Not IsArray($aProgs) Then Exit

Dim $aUsed[$aProgs[0]]

While 1
    Sleep(10)
    For $i = 1 To $aProgs[0]
        If Not $aUsed[$i - 1] And ProcessExists($aProgs[$i]) Then
            $aUsed[$i - 1] = 1
            _Action(IniRead($IniFile, $aProgs[$i], 'Path', ''))
        ElseIf $aUsed[$i - 1] = 1 And Not ProcessExists($aProgs[$i]) Then
            $aUsed[$i - 1] = 0
        EndIf
    Next
WEnd

Func _Action($sProg = '')
   ; MsgBox(64, @ScriptName, $sProg)
    If $sProg Then ShellExecute($sProg)
EndFunc   ;==>_Action
 
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
ra4o, спасибо.

А как сделать, чтобы не на процессы, а на конкретное слово в окне реагировало ?
 

ra4o

AutoIT Гуру
Сообщения
1 101
Репутация
222
Вместо "ProcessExists($aProgs[$i])" Использовать "WinGetTitle ("") и сравнивать заголовок со словом
 
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
ra4o
Так почему-то не работает.

Использую команду WinGetTitle вместо ProcessExists
Скрипт после запуска тут же прекращает свою работу.
(В документе ini - выставил вместо названий процессов - названия окон)

Но все равно не работает.

Код:
#include <file.au3>

;Global $aProgs[][] = [['calc.exe', 0, 'F:\-склад команд\1.au3'], ['cmd.exe', 0, 'F:\-склад команд\2.au3'], ['notepad.exe', 0, 'F:\-склад команд\2.au3']]
Global $IniFile = @ScriptDir & '\Data.ini'

Global $aProgs = IniReadSectionNames($IniFile)
If Not IsArray($aProgs) Then Exit

Dim $aUsed[$aProgs[0]]

While 1
    Sleep(10)
    For $i = 1 To $aProgs[0]
        If Not $aUsed[$i - 1] And WinGetTitle($aProgs[$i]) Then
            $aUsed[$i - 1] = 1
            _Action(IniRead($IniFile, $aProgs[$i], 'Path', ''))
        ElseIf $aUsed[$i - 1] = 1 And Not WinGetTitle($aProgs[$i])  Then
            $aUsed[$i - 1] = 0
        EndIf
    Next
WEnd

Func _Action($sProg = '')
   ; MsgBox(64, @ScriptName, $sProg)
    If $sProg Then ShellExecute($sProg)
       sleep(10000)
    EndFunc   ;==>_Action
 

IMStrelcov

CTPEJIbLLOB
Сообщения
143
Репутация
22
Как пример, под скрипт свой, думаю разберешься как адаптировать.
Код:
;структура файла:
;file|title
;file.au3|Калькулятор (полное или частичное название)
;и так далее

;для чтения из файла
$sTXT = FileRead('list.txt')

;эти 5 строк можно удалить (использовались для теста)
$sTXT = 'file1.au3|Калькулятор6'&@LF
$sTXT &= 'file2.au3|Калькулятор 7'&@LF
$sTXT &= 'D:\file3.au3|Кальк'&@LF
$sTXT &= 'file4.au3|Калькулятор9'&@LF
$sTXT &= 'file5.au3|Калькуляттор'

$aTitleList = StringRegExpReplace($sTXT, '(?im)([^\|]+\|)([^\n\r]+)([\n\r]+|\z)', '$2'&@LF)
$aTitleList = StringSplit($aTitleList, @LF)
$aScriptLis = StringRegExpReplace($sTXT, '(?im)([^\|]+)(\|.+([\n\r]+|\z))?', '$1'&@LF)
$aScriptLis = StringSplit($aScriptLis, @LF)

$sTXT = ''

While Sleep(250)
   For $iA = 1 To $aTitleList[0] -1
      If WinExists('[REGEXPTITLE:' & $aTitleList[$iA] & ']') Then
         MsgBox(0,'',$aScriptLis[$iA])
      EndIf
   Next
WEnd
 
Автор
R

RipVanWinkel

Новичок
Сообщения
81
Репутация
0
IMStrelcov, не подходит такой скрипт
Скрипт открывается - постоянно, пока определенная программа - работает (а нужно однократно). Это приводит к бесконечному появлению какого-то сообщения например, если там Msgbox стоит.

Схема D:\file3.au3|Кальк - неудобная, поскольку сперва будет идти длиннющий адрес, а где-то там в конце строки - за пределами экрана - надо будет вписывать ключевое слово.

Намного удобнее та схема, которую я описал -
[Блокнот]
path=F:\-склад команд\2.au3

Поэтому я про нее и спрашивал.
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
143
Репутация
22
1. Я ответил на два ваших вопроса:
Как формировать массив?
- не в строке кода, а брать его из txt ?
Код:
$sTXT = FileRead('list.txt')
$aTitleList = StringRegExpReplace($sTXT, '(?im)([^\|]+\|)([^\n\r]+)([\n\r]+|\z)', '$2'&[URL='https://autoit-script.ru/docs/macros.htm']@LF[/URL])
$aTitleList = StringSplit($aTitleList, [URL='https://autoit-script.ru/docs/macros.htm']@LF[/URL])
$aScriptLis = StringRegExpReplace($sTXT, '(?im)([^\|]+)(\|.+([\n\r]+|\z))?', '$1'&[URL='https://autoit-script.ru/docs/macros.htm']@LF[/URL])
$aScriptLis = StringSplit($aScriptLis, [URL='https://autoit-script.ru/docs/macros.htm']@LF[/URL])


Как заставить скрипт реагировать не на названия процессов, а на наличие конкретного слова внутри Title ?
Код:
WinExists('[REGEXPTITLE:' & $aTitleList[$iA] & ']')


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

2. Насчет:
Намного удобнее та схема, которую я описал -
[Блокнот]
path=F:\-склад команд\2.au3
поспорю, так как больше лишних слов писать в ini, в моем варианте ничего лишнего

3. Насчет:
Схема D:\file3.au3|Кальк - неудобная, поскольку сперва будет идти длиннющий адрес, а где-то там в конце строки - за пределами экрана - надо будет вписывать ключевое слово.
тоже не проблема исправив рег. выражения на:
Код:
$aTitleList = StringRegExpReplace($sTXT, '(?im)([^\|]+)(\|.*[\r\n]*)', '$1'&@LF)
$aTitleList = StringSplit($aTitleList, @LF)
$aScriptLis = StringRegExpReplace($sTXT, '(?im)(.+\|)(.+)([\r\n]*)', '$2'&@LF)
$aScriptLis = StringSplit($aScriptLis, @LF)

и в текст. файле писать
назв. заголовка | путь к файлу скрипта

4. Вот вам то что вы должны были сделать (адаптировать):
Код:
#include <file.au3>

;структура файла:
;title|file
;Калькулятор (полное или частичное название)|file.au3
;и так далее
$sTXT = FileRead('list.txt')
$aTitleList = StringRegExpReplace($sTXT, '(?im)([^\|]+)(\|.*[\r\n]*)', '$1'&@LF)
$aTitleList = StringSplit($aTitleList, @LF)
$aScriptLis = StringRegExpReplace($sTXT, '(?im)(.+\|)(.+)([\r\n]*)', '$2'&@LF)
$aScriptLis = StringSplit($aScriptLis, @LF)
$sTXT = ''

Dim $aUsed[$aTitleList[0]]

While 1
   Sleep(10)
   For $iA = 1 To $aTitleList[0] -1
      If Not $aUsed[$iA - 1] And WinExists('[REGEXPTITLE:' & $aTitleList[$iA] & ']') Then
         $aUsed[$iA - 1] = 1
         _Action($aScriptLis[$iA])
      ElseIf $aUsed[$iA - 1] = 1 And Not WinExists('[REGEXPTITLE:' & $aTitleList[$iA] & ']') Then
         $aUsed[$iA - 1] = 0
      EndIf
   Next
WEnd

Func _Action($sProg = '')
   ; MsgBox(64, @ScriptName, $sProg)
   If $sProg Then ShellExecute($sProg)
   sleep(10000)
EndFunc   ;==>_Action
 
Верх