Что нового

Скрипт на замену слов через блокнот notepad2

voordaluck

Новичок
Сообщения
8
Репутация
0
Добрый день.
AutoIt v3 Script: 3, 3, 2, 0

Нужен скрипт для notepad2
У него есть функция find and replace

Мне нужно, чтобы скрипт вставлял определенные слова в строку search
потом вставлял слово в строку replace with
нажимал replace all
нажимал ok (Если окно с окей не появилось по причине того, что таких слово не было найдено, то скрипт должен перейти дальше на другое слово)
и теперь вставлял другое слово в строку search
другое слово в строку replace with
и тд
надеюсь принцип понятен

Например заменяем слово Январь на Апрель
Потом Июнь на Сентябрь.
и таких слов может быть много.
 
Последнее редактирование:

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
и таких слов может быть много.
А тогда какой смысл это делать через текстовый редактор?
У вас есть текстовый файл + у Вас есть файл поиска и замены
Есть функция StringReplace , которую можно применить в цикле...
 
Автор
V

voordaluck

Новичок
Сообщения
8
Репутация
0
А тогда какой смысл это делать через текстовый редактор?
У вас есть текстовый файл + у Вас есть файл поиска и замены
Есть функция StringReplace , которую можно применить в цикле...
Я в этом не особо понимаю. Если дадите ссылку на готовый скрипт, то ок.

А ответ на вопрос, какой смысл через текстовый редактор. На мой взгляд просто это упрощает сам скрипт.
К тому же через блокнот я редактирую файлы типа .html

А для вашего варианта, это видимо надо прописывать в скрипте путь до конкретного файла, что не всегда удобно.
Сообщение автоматически объединено:

update
видимо нужно что то типа такого



Send("username")
Send("{TAB}")
Send("password")
ControlClick("Replace Text", "", "[CLASS:Button; INSTANCE:11]")
SLEEP(200)
ControlClick("Notepad2", "", "[CLASS:Button; INSTANCE:1]")

SLEEP(100)
ControlClick("Replace Text", "", "[CLASS:Edit; INSTANCE:1]")
Send("Arara")
Send("{TAB}")
Send("rrsdssd")
ControlClick("Replace Text", "", "[CLASS:Button; INSTANCE:11]")
SLEEP(200)
ControlClick("Notepad2", "", "[CLASS:Button; INSTANCE:1]")

SLEEP(100)
ControlClick("Replace Text", "", "[CLASS:Edit; INSTANCE:1]")
;Send("{del}")
Send("abba")
Send("{TAB}")
Send("rawe")
ControlClick("Replace Text", "", "[CLASS:Button; INSTANCE:11]")
SLEEP(200)
ControlClick("Notepad2", "", "[CLASS:Button; INSTANCE:1]")


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

Если кто то предложит лучше, то гуд
 
Последнее редактирование:

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
Я правда не совсем понял с задачей, но просто как быстрый вариант (может что потом на ум еще придет)
есть три файла
1. original.txt - оригинальный файл с текстом для замены
2. search.txt - файл со словами для поиска
3. replace.txt - файл со словами для замены

P.s учесть внимание на то, что количество строк search.txt и replace.txt должно совпадать
ну а далее скрипт все прогоняет и логирует, что ему удалось сделать, а что нет и в конце записывает New_file.txt уже с изменениями
 

Вложения

  • Test.zip
    1.4 КБ · Просмотры: 3
Автор
V

voordaluck

Новичок
Сообщения
8
Репутация
0
Я правда не совсем понял с задачей, но просто как быстрый вариант (может что потом на ум еще придет)
есть три файла
1. original.txt - оригинальный файл с текстом для замены
2. search.txt - файл со словами для поиска
3. replace.txt - файл со словами для замены

P.s учесть внимание на то, что количество строк search.txt и replace.txt должно совпадать
ну а далее скрипт все прогоняет и логирует, что ему удалось сделать, а что нет и в конце записывает New_file.txt уже с изменениями
Мой вариант, предложенный выше попроще явно.
Единственно вопрос. Почему через команду send он печатает буквы? А сразу нельзя просто, чтобы он копировал слово целиком?
 

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
Мой вариант, предложенный выше попроще явно.
Единственно вопрос. Почему через команду send он печатает буквы? А сразу нельзя просто, чтобы он копировал слово целиком?
Я бы не сказал что мой вариант сложный, когда там почти ничего лишнего, хотя можно сделать удобнее конечно же
а так если взять во внимание ваш вариант то там
1. Нужно обязательно открытый notepad
2. Вам все равно нужно делать базу, откуда будут браться данные для поиска и замены текста
3. Это sleep, он сам по себе уже замедляет скрипт что в свою очередь влияет на скорость
4. Вы не можете заниматься ничем другим, пока работает ваш скрипт, так как любой фокус в другом окне и send ломается, в таком случае пытаться его заменить на controlsend
5. Не очень удобное логирование того чего получилось сделать, а чего нет

а что касаемо send то это чисто имитация набора клавиш, и при этом она настолько фиговая, что другая раскладка на копьюетере все попросту сломает и лучше эту функцию избегать по возможности
 
Автор
V

voordaluck

Новичок
Сообщения
8
Репутация
0
Ужас для автоматизации
Я не на экзамене и не просил оценивать свой вариант.
В этой теме лично от вас никакого толку нет.

1. Нужно обязательно открытый notepad
2. Вам все равно нужно делать базу, откуда будут браться данные для поиска и замены текста
3. Это sleep, он сам по себе уже замедляет скрипт что в свою очередь влияет на скорость
4. Вы не можете заниматься ничем другим, пока работает ваш скрипт, так как любой фокус в другом окне и send ломается, в таком случае пытаться его заменить на controlsend
5. Не очень удобное логирование того чего получилось сделать, а чего нет
1. Да
2. Эту базу я переместил в скрипт.
3. Тут вопрос в том, что сам notepad тоже может заменять какое то время. Для этого и нужна пауза. Иначе чем это заменить?
4. ну да. Я и не пытаюсь, это дело 2х-3х минут.
5. Нет нужды в этом.
 

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
Тогда если в вашем скрипте вас все устраивает, то закрывайте тему и все. Нет смысла спрашивать про лучший вариант, когда вы будете стоять на своем.
А пунктами выше я показал вам чисто недостаток вашего варианта, а не спрашивал
 
Автор
V

voordaluck

Новичок
Сообщения
8
Репутация
0
Тогда если в вашем скрипте вас все устраивает, то закрывайте тему и все. Нет смысла спрашивать про лучший вариант, когда вы будете стоять на своем.
А пунктами выше я показал вам чисто недостаток вашего варианта, а не спрашивал
Молодец
Сообщение автоматически объединено:

А пунктами выше я показал вам чисто недостаток вашего варианта
Что вы мне показали? Что у меня notepad работает? Так это и было заявлено, что вся работа через него происходит)
У меня база в одном файле, просто в скрипте, а у вас надо 3 файла. Ещё и скрипт. Я считаю это минус.
про speep, ничего другого вы не предложили. Критикуете - предлагайте.
Сообщение автоматически объединено:

А ваш снобизм вы можете все оставить при себе.
 

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
Молодец
Сообщение автоматически объединено:


Что вы мне показали? Что у меня notepad работает? Так это и было заявлено, что вся работа через него происходит)
У меня база в одном файле, просто в скрипте, а у вас надо 3 файла. Ещё и скрипт. Я считаю это минус.
про speep, ничего другого вы не предложили. Критикуете - предлагайте.
Сообщение автоматически объединено:

А ваш снобизм вы можете все оставить при себе.
Вам ничего не мешает объединить их в один отдельный файл и сделать что то вроде
Сначала текст для поиска
Потом на что менять
Снова для поиска
И снова на что менять
Как из вариантов как уменьшить
А то что вы изначально указывайте в скрипте, то сами должны понимать что в скомпилированном варианте вы отредактировать ну никак не сможете и называть это базой такое себе
Сообщение автоматически объединено:

И что касаемо слипа, то вы ничего не сделаете вашим методом, или придумывать какие то проверки, что все удачно нажалось в самом нотпаде
 
Автор
V

voordaluck

Новичок
Сообщения
8
Репутация
0
Вам ничего не мешает объединить их в один отдельный файл и сделать что то вроде
Сначала текст для поиска
Потом на что менять
Снова для поиска
И снова на что менять
Как из вариантов как уменьшить
А то что вы изначально указывайте в скрипте, то сами должны понимать что в скомпилированном варианте вы отредактировать ну никак не сможете и называть это базой такое себе
По сути я так и сделал, текст для поиска и на что менять. Компилировать я и не собирался. Т.к. вероятно что скрипт придется дорабатывать постоянно. Добавлять новые слова.

И что касаемо слипа, то вы ничего не сделаете вашим методом, или придумывать какие то проверки, что все удачно началось в самом нотпаде
Вот и получается что sleep тут лучший вариант.
 

SealAlbinos

Продвинутый
Сообщения
154
Репутация
57
По сути я так и сделал, текст для поиска и на что менять. Компилировать я и не собирался. Т.к. вероятно что скрипт придется дорабатывать постоянно. Добавлять новые слова.


Вот и получается что sleep тут лучший вариант.
Т.е вам не нравится что будет один лишний условный файл, где будут хранится данные что искать и на что менять и который легко редактировать, но при этом вас устраивает вариант, где придется каждый раз лезть в сам скрипт и дописывать в нем данные, ну это дело ваше

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

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
чтобы он копировал слово целиком
Код:
$search = "username"
$replace = "password"
ControlSetText("Replace Text", "", "[CLASS:Edit; INSTANCE:1]", $search)
ControlSetText("Replace Text", "", "[CLASS:Edit; INSTANCE:2]", $replace)


может заменять какое то время. Для этого и нужна пауза. Иначе чем это заменить?
Код:
WinWait("Notepad2")
 
Последнее редактирование:

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Я не на экзамене и не просил оценивать свой вариант.
В этой теме лично от вас никакого толку нет.
А причём тут экзамены? - Реальный преподаватель Вам бы поставили 0000 за ваш код...
Кто редактирует текст через редактор? Только Вы
А если файл 100 мб , 2-3 Gb ....
"В этой теме лично от вас никакого толку нет."
Тем более от вас
Зачем задавать вопрос, когда вы всё и так типа знаете? - автоматизируйте и дальше через .опу
Хотел предложить код ... но не буду. Какой смысл создавать что-то для такого типа всезнайки
 
Последнее редактирование:
Автор
V

voordaluck

Новичок
Сообщения
8
Репутация
0
Код:
$search = "username"
$replace = "password"
ControlSetText("Replace Text", "", "[CLASS:Edit; INSTANCE:1]", $search)
ControlSetText("Replace Text", "", "[CLASS:Edit; INSTANCE:2]", $replace)
Отлично. Сам примерно так же сделал.
Сообщение автоматически объединено:

А причём тут экзамены? - Реальный преподаватель Вам бы поставили 0000 за ваш код...
Кто редактирует текст через редактор? Только Вы
А если файл 100 мб , 2-3 Gb ....
"В этой теме лично от вас никакого толку нет."
Тем более от вас
Зачем задавать вопрос, когда вы всё и так типа знаете? - автоматизируйте и дальше через .опу
Хотел предложить код ... но не буду. Какой смысл создавать что-то для такого типа всезнайки
У вас туго с головой. Реальный экзамен. Бла бла бла. А ничего, что я и есть заказчик скрипта, значит и оценивать мне?
Поэтому вы со своими комментариями можетит идти лесом прямо на юг.
Сообщение автоматически объединено:

Код:
$search = "username"
$replace = "password"
ControlSetText("Replace Text", "", "[CLASS:Edit; INSTANCE:1]", $search)
ControlSetText("Replace Text", "", "[CLASS:Edit; INSTANCE:2]", $replace)



Код:
WinWait("Notepad2")
Всё отлично, скрипт работает, ещё раз спасибо!
Сообщение автоматически объединено:

WinWait("Notepad2")
Есть одна проблема. Если скрипт не находит нужных слов, которые нужно заменить. То он дальше не идет.
Т.е. это активное окно, notepad не появляется.
Что делать?
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Можно ограничить время ожидания: третий параметр функции.
Код:
WinWait("Notepad2", "", 1) ; ждать одну секунду

На последней версии Notepad2 4.23.06 окно появляется даже если ничего не найдено. Поэтому у меня скрипт всегда работал.
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
У вас туго с головой. Реальный экзамен. Бла бла бла. А ничего, что я и есть заказчик скрипта, значит и оценивать мне?
Поэтому вы со своими комментариями можетит идти лесом прямо на юг.
А зачем мне за вами идти? - Любите лес - продолжайте ходить и дальше, возьмите ещё и корзинку...
Тут дело не в чьей-то голове, вы правы, а в заказчике в кепке....
Можете не отвечать, грибы в лесу не ищут дронами)))
 
Последнее редактирование:
Автор
V

voordaluck

Новичок
Сообщения
8
Репутация
0
Можно ограничить время ожидания: третий параметр функции.
Код:
WinWait("Notepad2", "", 1) ; ждать одну секунду

На последней версии Notepad2 4.23.06 окно появляется даже если ничего не найдено. Поэтому у меня скрипт всегда работал.
1 секунду ждать, не фонтан)
Нельзя что то другое сделать?

про Notepad. Последняя версия у них 4.2.25, остальные выше для девелоперов. В 4.2.25 скрипт тоже не идет дальше.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Нельзя что то другое сделать?
Примерно 165 мс при отсутствии окна
Код:
For $i = 0 To 9
  If WinExists("Notepad2") Then ExitLoop
  Sleep(10)
Next

Можете увеличить паузу или изменить количество итераций цикла.
Сообщение автоматически объединено:

Функция ожидания окна в миллисекундах
Код:
Func _WinWaitMs($Title = "", $Text = "", $TimeoutMs = 0)
  Local $Time = TimerInit()
  While Sleep(33)
    If WinExists($Title, $Text) Then Return WinGetHandle($Title, $Text)
    If $TimeoutMs > 0 And TimerDiff($Time) >= $TimeoutMs Then Return 0
  WEnd
EndFunc
 
Последнее редактирование:
Верх