Автор Тема: действия с текстом и нажатия комбинаций клавиш в активном окне  (Прочитано 2558 раз)

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

Оффлайн Alexey [?]

  • Новичок
  • *
  • Сообщений: 170
  • Репутация: 0
  • Пол: Мужской
    • Награды
Версия AutoIt: 3.3.14.2
Описание:
- имеется открытое и активное окно блокнота (notepad2), в котором перед запуском скрипта всегда открыт 1 несохранённый текстовый файл с названием 1 и расширением cue
- но путь всегда разный, так как файлы будут всегда разными и находиться будут всегда в разных каталогах
- окно блокнота остаётся активным всё время (во время работы скрипта я никаких окон трогать не буду)

возможен ли скрипт, после запуска которого автоматически выполнялись бы разные действия?
видимо, с какой-то очень мелкой задержкой между действиями, чтобы все корректно выполнялись. действия нужны именно в таком порядке:
1) нажатие ctrl + v

2) замена текста
CDImage.wav
на
1.flac
заменяемый фрагмент всегда имеется только в единственном экземпляре (в первой строке)

3) после каждого такого текстового фрагмента:
AUDIO
вставка такой новой строки (в её начале 4 пробела):
    TITLE ""5 символов AUDIO:
- всегда расположены в конце строк
- могут быть в разных количествах (от двух и более)

4) однократный запуск вот этого стороннего готового скрипта (суть его в перемещении строк нужным образом):
Код: AutoIt [Выделить]
#include <Array.au3>
#include <WinAPISys.au3>

Global $hWnd, $sData, $Window = '[REGEXPCLASS:(?i).*?Pad.*?]'

$hWnd = WinActive($Window)
If Not $hWnd Then Exit

_FixAccelHotKeyLayout()

$sData = ClipGet()
_Send('c')

Local $TSong, $Size, $sTextMod, $sText = ClipGet()
If $sText Then
    $Pos = StringInStr($sText, 'INDEX', 2, -1)
    $TSong = StringRegExp($sText, '.*\V', 3, $Pos)
    $Size = UBound($TSong)
    Select
        Case $Size > 1 And Not @error
          $sTextMod = StringRegExp($sText, '((.*\R\h+?)+' &$TSong[0]&')', 1)
          If IsArray($sTextMod) Then $sText = $sTextMod[0]
            For $i = 1 To $Size - 1
                $sText = StringReplace($sText, 'TITLE ""', 'TITLE "' & $TSong[$i] & '"', 1)
            Next
            ClipPut($sText)
            If BitAND(WinGetState($hWnd), 16) Then ContinueCase
            _Send('v{HOME}')
            ContinueCase
        Case Else
            ClipPut($sData)
            Exit
    EndSelect
EndIf

Func _FixAccelHotKeyLayout()
    Static $iKbrdLayout, $aKbrdLayouts
    If Execute('@exitMethod') <> '' Then
        Local $iUnLoad = 1
        For $i = 1 To $aKbrdLayouts[0]
            If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
                $iUnLoad = 0
                ExitLoop
            EndIf
        Next
        If $iUnLoad Then
            _WinAPI_UnloadKeyboardLayout($iKbrdLayout)
        EndIf
        Return
    EndIf
    $iKbrdLayout = 0x0409
    $aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
    _WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)
    OnAutoItExitRegister('_FixAccelHotKeyLayout')
EndFunc

Func _Send($Letter)
    SendKeepActive($hWnd)
    Send('{CTRLDOWN}a' &$Letter& '{CTRLUP}')
    SendKeepActive('')
EndFunc


5) нажатие ctrl + s
6) нажатие alt + f4

Примечания:
- перед запуском скрипта курсор расположен в самом начале файла
- окно блокнота принадлежит файлу notepad.exe
- window class: Notepad2
- window caption: всегда разный. в конце всегда такие символы:
1.cue - Notepad2

- кодировка: utf-8 (не должна меняться)
- match case: во всех случаях должен учитываться
- не знаю, возможно ли это, но хотелось бы обойтись без множественных сохранений и переоткрываний текстового файла во время работы скрипта

размещённый ниже код - это единственное, что я более-менее по теме сумел найти и при этом получить что-то работающее
с оговоркой, что это только мелкий кусочек от нужного результата, да и то не особо помогающий:
Код: AutoIt [Выделить]
#Include <File.au3>

If (_ReplaceStringInFile("C:\test.cue", "example-1", "example-2") = 0) Then
    ConsoleWriteError("cannot find [example-1] in [test.cue]" & @CRLF)
EndIf


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


Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 306
  • Репутация: 50
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
OffTopicЗачем менять файл в блокноте?
Почему нельзя менять файл напрямую из AutoIT?
Код: AutoIt [Выделить]

Оффлайн Alexey [?]

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

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

просто в данном случае не понимаю, что означают слова "менять файл"
так как нет задачи менять файл. есть необходимость менять содержимое файла

что касается _FileWriteToLine, то в справке написано:

1) Writes text to a specific line in a file
но пункт 3 в моём описании прямо показывает, что никаких "specific line" не будет известно заранее
в каждом случае будут разные строки и разное их количество
это с пунктом 2 проще: там строка одна и она заранее известна

2) $sFilePath - The file to write to
путь заранее не известен тоже - он всегда разный (об этом я упомянул)

Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 306
  • Репутация: 50
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Файлов cue у меня нет, делал на примере txt
Код: AutoIt [Выделить]
#include <File.au3>

FileDelete("d:\all_files.txt")
$CMD = "cd D:\ & dir/s/b *.txt >> d:\all_files.txt"
RunWait(@ComSpec & " /c " & $CMD) ;получаем список всех файлов txt на диске D:
$all_files = FileReadToArray("d:\all_files.txt") ;записываем его в массив
For $file in $all_files
    $current_file = FileReadToArray($file) ;каждый из файлов попеременно читаем в массив
    $j=0
    For $i=0 To UBound($current_file)-1 ;перебираем построчно
        If $current_file[$i]="CDImage.wav" Then ;если строка равна CDImage.wav, то вместо неё пишем 1.flac
            _FileWriteToLine($file, $i+1+$j, "1.flac", 1)
        EndIf
        If $current_file[$i]="AUDIO" Then
            _FileWriteToLine($file, $i+2+$j, "    TITLE", 0) ;если строка равна AUDIO, то после неё пишем     TITLE
            $j = $j + 1
        EndIf
    Next
Next
 

« Последнее редактирование: Апрель 28, 2018, 14:34:34 от hedji »

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


Оффлайн Alexey [?]

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

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
hedji, пока совсем не получается сообразить, как мне может этот код помочь
на данный момент не могу его даже протестировать, поскольку многое непонятно:

d:\all_files.txt - это временный файл, в фоновом режиме создаваемый скриптом и затем скриптом удаляемый?

допустим, в строке 2 для себя могу изменить d:\all_files.txt на C:\WINDOWS\Temp\auto-it-test-script.txt
в строке 3, соответственно, cd D:\ меняется на cd C:\WINDOWS\Temp\, а d:\all_files.txt меняется на C:\WINDOWS\Temp\auto-it-test-script.txt

но в строке 4 фразу "получаем список всех файлов txt на диске D" как понимать? мне не нужно получать список всех файлов txt/cue на диске D/C/E...
потому как если получать, то в моём случае будут десятки тысяч (если, конечно, я корректно уловил смысл комментариев в этом коде)

в строке 9 есть фраза "если строка равна CDImage.wav"
но строка никогда не будет равна CDImage.wav (CDImage.wav - это всегда только часть строки)
тоже самое касается AUDIO (AUDIO - это всегда только часть строки)

Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 306
  • Репутация: 50
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
d:\all_files.txt - это временный файл, в фоновом режиме создаваемый скриптом и затем скриптом удаляемый?
- да

cd D:\ & dir/s/b *.txt >> d:\all_files.txt - получает список txt файлов на диске D:\, если у вас все cue файлы лежат в папке  C:\WINDOWS\Temp\, то да, если они где-то на диске С:\, то cd С:\ & dir/s/b *.txt >> d:\all_files.txt Если вы заранее знаете какой файл хотите обработать, то эту часть можно пропустить и дополнить код выбором конкретного файла

замените равенство поиском вхождения подстроки

Оффлайн Alexey [?]

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

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Цитировать
если у вас все cue файлы лежат в папке  C:\WINDOWS\Temp\
все cue-файлы лежат примерно в 60 000 каталогах, которые лежат на дисках C, D, E, F, G (в будущем набор этих логических дисков будет многократно меняться)

Цитировать
Если вы заранее знаете какой файл хотите обработать
абсолютно заранее не знаю и знать никогда не буду
боюсь, как бы задача не оказалась гораздо более сложной, чем она, возможно, со стороны показалась вначале

Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 306
  • Репутация: 50
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
1) Получить список всех дисков в системе
Код: AutoIt [Выделить]
2) Найти все файлы cue на каждом диске из п.1
dir/s/b *.cue >> d:\all_files.txt
3) В каждом файле из п.2. найти вхождение подстроки и поменять нужные строки
Код: AutoIt [Выделить]
StringInStr($current_file[$i], "CDImage.wav")
 


Если бы вы выложили пример пары файлов, тестировали бы на реальных файлах.

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


Оффлайн Alexey [?]

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

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Цитировать
В каждом файле из п.2. найти вхождение подстроки и поменять нужные строки
в каждом не нужно (нужно только в одном файле)

нет ли какого-то куда более простого подхода?
ведь всего лишь требуется обработать короткое текстовое содержимое одного открытого файла в активном окне блокнота

то есть, дикостью кажется перебирание всех дисков в системе или всех десятков тысяч файлов с таким же расширением лишь для того чтобы внести мелкие изменения только в 1 уже открытый текстовый файл (который находится в активном окне, не фоновом)

пример файла:
FILE "CDImage.wav" WAVE
  TRACK 01 AUDIO
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    INDEX 01 03:54:00
  TRACK 03 AUDIO
    INDEX 01 07:30:02

[тут всегда несколько строк (с разным текстом): от двух до примерно сотни]
[тут всегда пустая строка]
пример пары файлов не нужен, так как разница всегда будет только:
- в цифрах (например, не 03:54:00, а 04:37:13)
- в содержимом тех строк, которых "от двух до примерно сотни", и которые, по сути, в этом скрипте не участвуют


если пока вести речь только о пунктах 2-3 (из первого сообщения), то вот конкретный пример:
вот это имеется прямо перед запуском скрипта:
FILE "CDImage.wav" WAVE
  TRACK 01 AUDIO
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    INDEX 01 03:54:00
  TRACK 03 AUDIO
    INDEX 01 07:30:02

Title 01
Title 02
Title 03

вот это должно получиться сразу после завершения работы скрипта:
FILE "1.flac" WAVE
  TRACK 01 AUDIO
    TITLE ""
    INDEX 01 00:00:00
  TRACK 02 AUDIO
    TITLE ""
    INDEX 01 03:54:00
  TRACK 03 AUDIO
    TITLE ""
    INDEX 01 07:30:02

Title 01
Title 02
Title 03


Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 306
  • Репутация: 50
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
в каждом не нужно (нужно только в одном файле)

нет ли какого-то куда более простого подхода?
ведь всего лишь требуется обработать короткое текстовое содержимое одного открытого файла в активном окне блокнота

Цитировать
абсолютно заранее не знаю и знать никогда не буду

Определитесь какую задачу решаем: перелопатить скриптом 60000 файлов, или взять один конкретный файл и в нем поменять.

Оффлайн Alexey [?]

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

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
взять 1 конкретный файл и в нём поменять

в пункте 4 (из первого сообщения этой темы) размещён полностью рабочий и проверенный временем скрипт от Alofa
которого, пользуясь случаем, ещё раз благодарю за этот полезный скрипт и прошу, если это не сложно, помочь с добавлением туда хотя бы пунктов 2-3 (из первого сообщения этой темы), которые очень похожи по функционалу на то, что скрипт уже умеет делать

то есть, пункт 4 уже готов в виде скрипта, а смысл в том, чтобы этот готовый скрипт перед тем, что он делает сейчас (специальным образом перемещает те самые строки, которых "от двух до примерно сотни"), выполнял бы ещё пункты 2-3

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1424
  • Репутация: 209
  • Пол: Мужской
  • Windows 7 /10 [x64]
    • Награды
  • Версия AutoIt: 3.3.12.0
... если это не сложно...
Да вроде как сложностей быть не должно (за исключением того, что пока PC под рукой нет).
Чтобы избежать разногласий, как в Этой теме, хочу сразу уточнить один момент. Возможно два (как я это вижу) подхода для реализации вашей задачи:
Вар.1) Вычисляем какой файл открыт в активном окне блокнота, закрываем это окно и далее работаем с файлом.
Вар.2) Работаем только с окном блокнота при помощи "костылей".
Какой из вариантов вы хотите увидеть?

P.s: а возможно обойтись вообще без блокнота: создать программу со своим окном и кидать туда файлы для преобразования.
« Последнее редактирование: Апрель 29, 2018, 18:55:02 от Alofa »

Оффлайн Alexey [?]

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

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
пусть будет вариант 1
только я не сразу сообразил, что было бы немного лучше, если бы скрипт работал не c активным окном блокнота, а с последним окном блокнота в панели задач
и работал вне зависимости от состояния последнего окна блокнота (активное/неактивное)

то есть, если это частичное изменение реализуемо без проблем, то вариант 1 будет звучать так:
- вычисляем, какой файл открыт в последнем окне блокнота в панели задач (системная настройка "group similar taskbar buttons" всегда выключена)
- это окно с несохранённым файлом, поэтому сохраняем файл
- закрываем окно
- далее работаем с файлом
- работа заключается в выполнении по очереди 6 пунктов (из первого сообщения этой темы)
из которых пункт 6 теперь не нужен, поскольку закрывать будет нечего - вся работа выполняется при закрытом файле
выполнение пункта 1 подразумевает, что курсор находится в самом начале файла

нужное для обработки скриптом окно блокнота почти всегда будет не единственным в панели задач, где разных окон блокнота может быть вплоть до нескольких десятков
надеюсь, это не станет проблемой для скрипта, то есть, он сможет корректно работать только с одним нужным окном блокнота
и сможет никак не трогать другие окна блокнота, в которых будут открыты другие файлы, в том числе, возможно, и несохранённые
« Последнее редактирование: Апрель 30, 2018, 05:00:34 от Alexey »

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1424
  • Репутация: 209
  • Пол: Мужской
  • Windows 7 /10 [x64]
    • Награды
  • Версия AutoIt: 3.3.12.0
пусть будет вариант 1...
Почитал предыдущую Вашу тему, эту перечитал и пошел по пути наименьшего сопротивления - т.е. сделал вариант №2.
(нажмите для показа/скрытия)
« Последнее редактирование: Май 03, 2018, 10:33:08 от Alofa »

Оффлайн Alexey [?]

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

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
Цитировать
нажатие ctrl + v (не понял, а нужно ли?)
каждый раз к моменту запуска скрипта в буфере обмена будет немного специально подготовленного текста, который должен быть вставлен в окно блокнота. поэтому нужно ctrl+v

хочу уточнить непонятные для меня нюансы:

1) в строке 23 указано: Пункт 3) и 4)
но пункт 4 - это из другой темы предыдущий скрипт, по размеру превышающий весь этот
верно ли понимаю, что пункта 4 тут в действительности нет?
или весь тот скрипт теперь неимоверно сокращён до нескольких строк? (имеются в виду строки 27-30)

2) верно ли понимаю, что замена текста CDImage.wav на 1.flac реализована как-то хитро?
поскольку ни CDImage, ни wav не упоминаются в скрипте в явном виде

3) верно ли понимаю, что этому варианту скрипта требуется именно открытое окно блокнота?

добавлено позднее:
последнюю строку следует читать как:
3) верно ли понимаю, что этому варианту скрипта требуется именно активное окно блокнота?
« Последнее редактирование: Май 01, 2018, 03:22:42 от Alexey »

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


 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
2376 Просмотров
Последний ответ Ноябрь 08, 2011, 23:39:43
от Belfigor
1 Ответов
1555 Просмотров
Последний ответ Март 06, 2013, 19:28:41
от InnI
0 Ответов
1465 Просмотров
Последний ответ Июнь 14, 2013, 20:12:29
от madmasles
4 Ответов
2073 Просмотров
Последний ответ Март 05, 2014, 14:04:11
от Yuriy
1 Ответов
1642 Просмотров
Последний ответ Май 30, 2014, 13:32:39
от InnI
5 Ответов
3771 Просмотров
Последний ответ Апрель 07, 2015, 18:41:20
от darklord422
2 Ответов
2025 Просмотров
Последний ответ Июнь 01, 2015, 11:28:10
от ---Zak---
7 Ответов
1423 Просмотров
Последний ответ Декабрь 18, 2015, 00:19:29
от m4e
7 Ответов
3100 Просмотров
Последний ответ Февраль 18, 2016, 15:42:10
от Alofa
0 Ответов
445 Просмотров
Последний ответ Август 11, 2017, 10:03:51
от dimcomp