Автор Тема: Выполнение последовательности операций, по списку файлов - в файле txt  (Прочитано 530 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн RipVanWinkel [?]

  • Новичок
  • *
  • Сообщений: 15
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Версия AutoIt: 3.3.14.2

Описание:

Добрый день, уважаемые программисты.

Как реализовать при помощи autoit - следующий алгоритм?
В папке лежит файл Список.txt и файл Итог.txt

Требуется открытие программой по умолчанию - уже существующего файла Итог.txt
Затем поочередное открытие -  файлов из списка и перенос информации из них в файл Итог.txt.

(Открытие первого файла из списка, Ctrl+A, Ctrl+C, переход в файл Итог.txt , Ctrl+A, End,  Ctrl+V, закрытие первого файла из списка, открытие второго файла из списка)
Закрытие файла Итог.txt с сохранением.

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

Важно именно решение при помощи поочередного открытия файлов и использования горячих клавиш.

Примечания:


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться
« Последнее редактирование: Октябрь 09, 2017, 16:43:26 от RipVanWinkel »

Русское сообщество AutoIt


Онлайн Tempo [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 25
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Важно именно решение при помощи поочередного открытия файлов и использования горячих клавиш.

Все таки вам нужно это чудо которое вы предлагали сделать для объединения DOC файлов

Код: AutoIt [Выделить]
#include <WinAPIProc.au3>
HotKeySet("{ESC}", "_Exit")

Global $sPathList = "Список.txt", $sOutTxt = "Итог.txt", $aList, $aWnds, $iOutPID, $hOutWnd, $iPID, $hWnd

$aList = FileReadToArray($sPathList)
If @error Then Exit MsgBox(16, "", "Ошибка списка.")

If Not FileExists($sOutTxt) Then Exit MsgBox(16, "", "Итог не существует.")
$iOutPID = ShellExecute($sOutTxt)
If Not $iOutPID Then
    MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
    $hOutWnd = WinGetHandle("[ACTIVE]")
Else
    Do
        Sleep(250)
        If Not ProcessExists($iOutPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
        $aWnds = _WinAPI_EnumProcessWindows($iOutPID)
    Until Not @error
    $hOutWnd = $aWnds[1][0]
EndIf

For $i = 0 To UBound($aList) - 1
    If Not FileExists($aList[$i]) Then ContinueLoop
    $iPID = ShellExecute($aList[$i])
    If Not $iOutPID Then
        MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
        $hWnd = WinGetHandle("[ACTIVE]")
    Else
        Do
            Sleep(250)
            If Not ProcessExists($iPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
            $aWnds = _WinAPI_EnumProcessWindows($iPID)
        Until Not @error
        $hWnd = $aWnds[1][0]
    EndIf
    WinActivate($hWnd)
    WinWaitActive($hWnd)
    ControlSend($hWnd, "", "", "^a^c")
    Sleep(250)
    WinActivate($hOutWnd)
    WinWaitActive($hOutWnd)
    ControlSend($hOutWnd, "", "", "^{END}^v")
    WinClose($hWnd)
    WinWaitClose($hWnd)
Next

ControlSend($hOutWnd, "", "", "^s")
Sleep(250)
WinClose($hOutWnd)

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 


Оффлайн RipVanWinkel [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tempo , что-то не работает.

При запуске скрипта - открывается два файла Итог.txt и первый файл списка 12-4976.txt
Дальше ничего не происходит.

Онлайн Tempo [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 25
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tempo , что-то не работает.

При запуске скрипта - открывается два файла Итог.txt и первый файл списка 12-4976.txt
Дальше ничего не происходит.

А в какой программе они у вас открываются? Это именно TXT файлы?


Добавлено: Октябрь 09, 2017, 20:26:08
И еще у вас в примере пустые файлы так что рекомендую в них что-то написать

Русское сообщество AutoIt


Оффлайн RipVanWinkel [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tempo, ну вот те файлы которые я прикрепил - они открываются в обычной программе Блокнот (которая находится в Стандартных программах).

Насчет пустых файлов - разумеется я записал в них текст.
Но все равно не работает.


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Онлайн Tempo [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 25
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Но все равно не работает.

А с окнами которые открываются вы что-то делаете?

Убрал ожидание активности окна

Код: AutoIt [Выделить]
#include <WinAPIProc.au3>
HotKeySet("{ESC}", "_Exit")

Global $sPathList = "Список.txt", $sOutTxt = "Итог.txt", $aList, $aWnds, $iOutPID, $hOutWnd, $iPID, $hWnd

$aList = FileReadToArray($sPathList)
If @error Then Exit MsgBox(16, "", "Ошибка списка.")

If Not FileExists($sOutTxt) Then Exit MsgBox(16, "", "Итог не существует.")
$iOutPID = ShellExecute($sOutTxt)
If Not $iOutPID Then
    MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
    $hOutWnd = WinGetHandle("[ACTIVE]")
Else
    Do
        Sleep(250)
        If Not ProcessExists($iOutPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
        $aWnds = _WinAPI_EnumProcessWindows($iOutPID)
    Until Not @error
    $hOutWnd = $aWnds[1][0]
EndIf

For $i = 0 To UBound($aList) - 1
    If Not FileExists($aList[$i]) Then ContinueLoop
    $iPID = ShellExecute($aList[$i])
    If Not $iOutPID Then
        MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
        $hWnd = WinGetHandle("[ACTIVE]")
    Else
        Do
            Sleep(250)
            If Not ProcessExists($iPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
            $aWnds = _WinAPI_EnumProcessWindows($iPID)
        Until Not @error
        $hWnd = $aWnds[1][0]
    EndIf
    WinActivate($hWnd)
    ControlSend($hWnd, "", "", "^a^c")
    Sleep(250)
    WinActivate($hOutWnd)
    ControlSend($hOutWnd, "", "", "^{END}^v")
    WinClose($hWnd)
    WinWaitClose($hWnd)
Next

ControlSend($hOutWnd, "", "", "^s")
Sleep(250)
WinClose($hOutWnd)

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 

« Последнее редактирование: Октябрь 09, 2017, 20:49:42 от Tempo »

Оффлайн RipVanWinkel [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tempo, нет - с окнами ничего не делаю - дожидаюсь когда выполнится скрипт.

 Сейчас скрипт работает так.
Сперва открывается файл Итог.txt
Затем открывается первый файл из списка.
Идет переключение на файл Итог.txt (но ничего не копируется)
Затем открывается первый файл из списка.
Опять идет переключение на файл Итог.txt (и опять ничего не копируется)
Потом то же происходит и с третьим файлом.

То есть происходит постепенное открытие и переключение между окнами, но файл Итог.txt - остается пустым.


Онлайн Tempo [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 25
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
То есть происходит постепенное открытие и переключение между окнами, но файл Итог.txt - остается пустым.

А если так

Код: AutoIt [Выделить]
#include <WinAPIProc.au3>
HotKeySet("{ESC}", "_Exit")

Global $sPathList = "Список.txt", $sOutTxt = "Итог.txt", $aList, $aWnds, $iOutPID, $hOutWnd, $iPID, $hWnd

$aList = FileReadToArray($sPathList)
If @error Then Exit MsgBox(16, "", "Ошибка списка.")

If Not FileExists($sOutTxt) Then Exit MsgBox(16, "", "Итог не существует.")
$iOutPID = ShellExecute($sOutTxt)
If Not $iOutPID Then
    MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
    $hOutWnd = WinGetHandle("[ACTIVE]")
Else
    Do
        Sleep(250)
        If Not ProcessExists($iOutPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
        $aWnds = _WinAPI_EnumProcessWindows($iOutPID)
    Until Not @error
    $hOutWnd = $aWnds[1][0]
EndIf

For $i = 0 To UBound($aList) - 1
    If Not FileExists($aList[$i]) Then ContinueLoop
    $iPID = ShellExecute($aList[$i])
    If Not $iOutPID Then
        MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
        $hWnd = WinGetHandle("[ACTIVE]")
    Else
        Do
            Sleep(250)
            If Not ProcessExists($iPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
            $aWnds = _WinAPI_EnumProcessWindows($iPID)
        Until Not @error
        $hWnd = $aWnds[1][0]
    EndIf
    WinActivate($hWnd)
    ControlSend($hWnd, "", "", "^a")
    Sleep(250)
    ControlSend($hWnd, "", "", "^c")
    Sleep(250)
    WinActivate($hOutWnd)
    ControlSend($hOutWnd, "", "", "^{END}")
    Sleep(250)
    ControlSend($hOutWnd, "", "", "^v")
    Sleep(250)
    WinClose($hWnd)
    WinWaitClose($hWnd)
Next

ControlSend($hOutWnd, "", "", "^s")
Sleep(250)
WinClose($hOutWnd)

Func _Exit()
    Exit
EndFunc   ;==>_Exit

 


И еще вариант

(нажмите для показа/скрытия)
« Последнее редактирование: Октябрь 09, 2017, 21:09:48 от Tempo »

Русское сообщество AutoIt


Оффлайн RipVanWinkel [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tempo , сейчас открываются только Итог.txt и первый файл из списка.
Дальше ничего не происходит.
(у обоих вариантов такой эффект)

Онлайн Tempo [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 25
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include <WinAPIProc.au3>
HotKeySet("{ESC}", "_Exit")

Global $sPathList = "Список.txt", $sOutTxt = "Итог.txt", $aList, $aWnds, $iOutPID, $hOutWnd, $iPID, $hWnd

$aList = FileReadToArray($sPathList)
If @error Then Exit MsgBox(16, "", "Ошибка списка.")

If Not FileExists($sOutTxt) Then Exit MsgBox(16, "", "Итог не существует.")
$iOutPID = ShellExecute($sOutTxt)
If Not $iOutPID Then
    MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
    $hOutWnd = WinGetHandle("[ACTIVE]")
Else
    Do
        Sleep(250)
        If Not ProcessExists($iOutPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
        $aWnds = _WinAPI_EnumProcessWindows($iOutPID)
    Until Not @error
    $hOutWnd = $aWnds[1][0]
EndIf

For $i = 0 To UBound($aList) - 1
    If Not FileExists($aList[$i]) Then ContinueLoop
    $iPID = ShellExecute($aList[$i])
    If Not $iOutPID Then
        MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
        $hWnd = WinGetHandle("[ACTIVE]")
    Else
        Do
            Sleep(250)
            If Not ProcessExists($iPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
            $aWnds = _WinAPI_EnumProcessWindows($iPID)
        Until Not @error
        $hWnd = $aWnds[1][0]
    EndIf
    WinActivate($hWnd)
    ClipPut("")
    Do
        ControlSend($hWnd, "", "", "^a")
        Sleep(250)
        ControlSend($hWnd, "", "", "^c")
        Sleep(250)
    Until ClipGet()
    WinActivate($hOutWnd)
    ControlSend($hOutWnd, "", "", "^{END}")
    Sleep(250)
    ControlSend($hOutWnd, "", "", "^v")
    Sleep(250)
    WinClose($hWnd)
    WinWaitClose($hWnd)
Next

ControlSend($hOutWnd, "", "", "^s")
Sleep(250)
WinClose($hOutWnd)

Func _Exit()
    Exit
EndFunc   ;==>_Exit

 


Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2556
  • Репутация: 434
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
RipVanWinkel  [?]
Цитировать
(Открытие первого файла из списка, Ctrl+A, Ctrl+C, переход в файл Итог.txt , Ctrl+A, End,  Ctrl+V, закрытие первого файла из списка, открытие второго файла из списка)
это зачем? зачем городить огород, если просто считать файлы и все вписать в один. там несколько строк кода
зачем эмулирование нажатия клавиш?
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн RipVanWinkel [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tempo , то же самое.
Открываются только Итог.txt и первый файл из списка - больше ничего не происходит.

Онлайн Tempo [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 25
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tempo , то же самое.
Открываются только Итог.txt и первый файл из списка - больше ничего не происходит.

У вас те окна что открываются активны или нет?

Код: AutoIt [Выделить]
#include <WinAPIProc.au3>
HotKeySet("{ESC}", "_Exit")

Global $sPathList = "Список.txt", $sOutTxt = "Итог.txt", $aList, $aWnds, $iOutPID, $hOutWnd, $iPID, $hWnd

$aList = FileReadToArray($sPathList)
If @error Then Exit MsgBox(16, "", "Ошибка списка.")

If Not FileExists($sOutTxt) Then Exit MsgBox(16, "", "Итог не существует.")
$iOutPID = ShellExecute($sOutTxt)
If Not $iOutPID Then
    MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
    $hOutWnd = WinGetHandle("[ACTIVE]")
Else
    Do
        Sleep(250)
        If Not ProcessExists($iOutPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
        $aWnds = _WinAPI_EnumProcessWindows($iOutPID)
    Until Not @error
    $hOutWnd = $aWnds[1][0]
EndIf

For $i = 0 To UBound($aList) - 1
    If Not FileExists($aList[$i]) Then ContinueLoop
    $iPID = ShellExecute($aList[$i])
    If Not $iOutPID Then
        MsgBox(48, "", "Нажмите ОК когда появится нужное окно.")
        $hWnd = WinGetHandle("[ACTIVE]")
    Else
        Do
            Sleep(250)
            If Not ProcessExists($iPID) Then Exit MsgBox(16, "", "Ошибка запуска.")
            $aWnds = _WinAPI_EnumProcessWindows($iPID)
        Until Not @error
        $hWnd = $aWnds[1][0]
    EndIf
    WinActivate($hWnd)
    Send("^a")
    Sleep(250)
    Send("^c")
    Sleep(250)
    WinActivate($hOutWnd)
     Send("^{END}")
    Sleep(250)
    Send("^v")
    Sleep(250)
    WinClose($hWnd)
    WinWaitClose($hWnd)
Next

Send("^s")
Sleep(250)
WinClose($hOutWnd)

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 



Добавлено: Октябрь 09, 2017, 21:26:12
Еще вариант

(нажмите для показа/скрытия)

Оффлайн RipVanWinkel [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tempo, первый скрипт в каждом открытом файле (из списка)  - в первой строчке написал буквы "ac", а в файле Итог.txt образовалась строчка "vvvs"

Второй код поочередно открывает окна файлов из списка, периодически переключает активность окна на Итог.txt (но ничего не копирует)

Помечен как лучший ответ пользователем RipVanWinkel Отправлен Октябрь 09, 2017, 21:55:09

Онлайн Tempo [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 25
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Tempo, первый скрипт в каждом открытом файле (из списка)  - в первой строчке написал буквы "ac", а в файле Итог.txt образовалась строчка "vvvs"

Это значит что Send эмулирует нажатия без CTRL (три раза CTRL+V и для сохранения CTRL+S) и пока что у меня нет идей почему у вас это происходит именно так
У меня работают все варианты  :think:


Добавлено: Октябрь 09, 2017, 21:43:09
Этот вариант пробовали?

(нажмите для показа/скрытия)

И еще

(нажмите для показа/скрытия)


Добавлено: Октябрь 09, 2017, 21:49:23
И еще

(нажмите для показа/скрытия)
« Последнее редактирование: Октябрь 09, 2017, 21:49:23 от Tempo, Причина: Объединение сообщений »

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
1 Ответов
2493 Просмотров
Последний ответ Февраль 23, 2011, 16:09:50
от `p r o x y
4 Ответов
2280 Просмотров
Последний ответ Ноябрь 27, 2012, 13:59:17
от ynbIpb
1 Ответов
2003 Просмотров
Последний ответ Июль 12, 2013, 14:55:29
от ---Zak---
2 Ответов
1384 Просмотров
Последний ответ Ноябрь 21, 2013, 05:37:33
от Redcut
2 Ответов
565 Просмотров
Последний ответ Август 01, 2014, 09:04:05
от olegkyka
3 Ответов
838 Просмотров
Последний ответ Август 25, 2014, 12:04:19
от madmasles
26 Ответов
3439 Просмотров
Последний ответ Декабрь 28, 2015, 10:12:25
от Yashied
5 Ответов
1595 Просмотров
Последний ответ Март 25, 2016, 12:22:25
от InnI
4 Ответов
4597 Просмотров
Последний ответ Июнь 28, 2016, 15:26:59
от equinox
13 Ответов
1103 Просмотров
Последний ответ Февраль 18, 2017, 13:18:29
от Parazit