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

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

shadowbat 15-06-2010 01:18 1434222

Скопировать заголовок окна
 
есть: 1800 обычных exe файлов. (0001.exe, 0002.exe, 0003.exe ...)
задача: скопировать из них заголовки и сделать список txt такого типа:
Код:

0001 "заголовок окна файла 0001.exe"
0002 "заголовок окна файла 0002.exe"
0003 "заголовок окна файла 0003.exe"
...


beve 15-06-2010 12:18 1434414

Цитата:

Цитата shadowbat
есть: 1800 обычных exe файлов. (0001.exe, 0002.exe, 0003.exe ...)
задача: скопировать из них заголовки »

уточнение, Эти программы уже запущенны все, что ли, ибо как иначе заголовки взять?
Или же нужно не заголовки, а именно названия файлов обрабатывать, а файлы лежать в одной директории?

shadowbat 15-06-2010 12:52 1434445

файлы exe это установщики
файлы в одной директории.
для обработки названий файлов у меня есть програмулина

1. файлы естественно не запущенные. програмка сама должна их запускать
2. НУЖНЫ ЗАГОЛОВКИ (см. скриншот)

beve 15-06-2010 13:46 1434500

Цитата:

Цитата shadowbat
1. файлы естественно не запущенные. програмка сама должна их запускать »

Картина еще не полная, думаю никто не сможет помочь пока не будет уточнено такое:
эти программы, после запуска,имеют всего лиш один тот же заголовок, неважно это первое окно или окна меняются, но заголовок один и тот же? И все что требуется, это такой алгоритм:
1. Запускаем наш созданный обработчик, и он берет названия всех файлов в указанной директории в массив.
2. Дальше по очереди запускает каждую програмку из списка массива, ждет появления окна, берет в этого окна заголовок, закрывает эту програмку и пишет строчку в файл с порядковым номером програмки - заголовком 1 окна при ее запуске - и название програмки?

shadowbat 15-06-2010 14:57 1434550

Цитата:

Цитата beve
эти программы, после запуска,имеют всего лиш один тот же заголовок, неважно это первое окно или окна меняются, но заголовок один и тот же?

не пойму. заголовки разные. но могут 2-3 попасться одинаковые.

вот для примера 2 разных exe-файла. (30 мб) http://multi-up.com/289485, http://multi-up.com/289486)

естественно заголовки (названия окон) разные. короче - вот список http://multi-up.com/289980
он в формате PDF. делался с этих же файлов, но делался косячно.
нужно сделать типа такого же заново.


Цитата:

Цитата beve
И все что требуется, это такой алгоритм:
1. Запускаем наш созданный обработчик, и он берет названия всех файлов в указанной директории в массив.
2. Дальше по очереди запускает каждую програмку из списка массива, ждет появления окна, берет в этого окна заголовок, закрывает эту програмку и пишет строчку в файл с порядковым номером програмки - заголовком 1 окна при ее запуске - и название програмки?[/post]

подчеркнутое совсе не понял. от лексикона голова кипит.

нужно так.
Цитата:

Цитата beve
1. Запускаем наш созданный обработчик, и он берет названия всех файлов в указанной директории в массив.
2. Дальше по очереди запускает каждую програмку из списка массива, ждет появления окна,

копирует название окна (на скриншоте выше обведено красным) и вписывает в txt файл строчку
Код:

"название файла без расширения" "название заголовка"
и так 1800 раз, т.е. 1800 разных строчек с разными именами файлов и соотносящимися к ним заголовками

kaster 15-06-2010 16:33 1434616

тогда алгоритм такой.
1. делается список (массив) из содержимого целевой папки (1800 exe'шников)

2.1 запускается первая программа из списка, ловится окно, считывается заголовок в новый массив
2.2 запускается вторая, считывается заголовок в новый массив
...
2.1800 запускается 1800-ая, считывается заголовок в новый массив

3. из элементов массива с заголовками парсится нужная строка вида
Код:

порядковый_номер  заголовок_окна  название_приложения
только есть одно но - это займет неимоверно кучу времени. а если это установщики собранные для msiexec.exe, которые не дает запускать несколько копий одновременно, то еще больше.

beve 15-06-2010 16:40 1434620

Вот, очень по-простому:
Код:

$SearchDir=@ScriptDir ;папка с файлами *.exe
$txtFile=@ScriptDir&"\file.txt" ;название текстового файла для записи результата

$hSearch = FileFindFirstFile($SearchDir&"\*.exe"; Инициализация поиска
If $hSearch= -1 Then
   
MsgBox(0, "Error", "No files/directories matched the search pattern")
   
Exit
EndIf

;открытие текстового файла для записывания результата в конец файла
$h_txtFile = FileOpen($txtFile, 1)
If $h_txtFile = -1 Then
   
MsgBox(0, "Error", "Unable to open file.")
   
Exit
EndIf

;цикл - пока существуют файлы в директории
While 1
   
$file = FileFindNextFile($hSearch)
;ищем следующий файл
   
If @error Then ExitLoop

   
$PID=run($file, $SearchDir,@SW_MINIMIZE )
;запускаем в свернутом режиме
   
ProcessWait
($PID)
   
Sleep(250)
;ожидание окна, чтобы лишний раз не гонять цикл, который ниже

;цикл для ожидания окна программы, будет работать пока не появится окно программы.
   
do
       
$sTitle=
_WinGetTitleByPID($PID)
       
Sleep(50)
   
Until $sTitle<>"" Or ProcessExists($PID)==0

   
FileWriteLine
($h_txtFile, StringTrimRight($file, 4)& " "&
StringRegExpReplace($sTitle,"Установка программы '(.*?)'","\1") & @CRLF) ; запись в файл очередной строки, где будет имя файла без расширения, пробел, нужный заголовок.

   
ProcessClose
($PID)
   
ProcessWaitClose($PID)
   
$PID=""
   
$sTitle=""
WEnd

; Close the search handle
FileClose
($hSearch)
;Close the txt file
FileClose
($h_txtFile)

;функция от http://creator-lab.ucoz.ru/load/3-1-0-19
Func _WinGetTitleByPID($iPID, $nArray = 1)
   
If IsString($iPID) Then $iPID = ProcessExists($iPID)
   
Local $aWList =
WinList(), $sHold
   
For $iCC = 1 To $aWList[0][0]
       
If
WinGetProcess($aWList[$iCC][1]) = $iPID And _
           
BitAND(WinGetState($aWList[$iCC][1]), 2) Then
            If
$nArray Then Return $aWList[$iCC][0]
           
$sHold &= $aWList[$iCC][0] & Chr(1)
       
EndIf
    Next
    If
$sHold Then Return StringSplit(StringTrimRight($sHold, 1), Chr(1))
   
Return SetError(1, 0, 0)
EndFunc

P.S. Если программы-установщики похожие, то будет работать, иначе, нужно будет еще дорабатывать. Но суть думаю понятна.

shadowbat 15-06-2010 19:43 1434762

beve, СУПЕР! работает как надо! пойду запущу на все файлы :)

beve, а насколько эта задача сложная? сколько времени у Вас заняло написание такого скрипта?
хочется поближе познакомиться с автоит. он прост в изучении? или это такой же язык програмирования как c++ pascal delphi ?

т.е. html я изучать не мог. а вот через WYSIWYG странички делать получается легко.
то же самое и с автоит хочется узнать. можно ли писать простые скриптики одним махом руки?

zonderz 15-06-2010 21:44 1434840

Цитата:

Цитата shadowbat
можно ли писать простые скриптики одним махом руки? »

можно и быстрее...
нужно научиться понимать логику (переменные, циклы и пр.) и не бояться самостоятельно читать справку (там, кстати, есть все для старта).
Удачи.


shadowbat 15-06-2010 22:43 1434875

Цитата:

Цитата zonderz
нужно научиться понимать логику (переменные, циклы и пр.) и не бояться самостоятельно читать справку (там, кстати, есть все для старта).[/post]

спасибо! алгоритмизацию понимаю и в паскале лет 6 назад чего то делал. пойду справку полистаю


Время: 17:47.

Время: 17:47.
© OSzone.net 2001-