View previous topic :: View next topic |
Author |
Message |
aLexx
Joined: 14 Mar 2005 Posts: 442 Location: Новокузнецк
|
(Separately) Posted: Sat Jun 23, 2007 05:34 Post subject: Поиск файлов, содержащих текст |
|
|
Есть у меня на панели кнопка, кот. осуществляет поиск файлов, содержащих определённый текст.
Этот текст предварительно занесён в буфер. Кнопка вызывает этот скрипт:
Code: |
'File: FindText.vbs
'Description: Поиск файлов, содержащих текст из буфера обмена
'Requirements: WSH Helper for TC by Volniy
'Installation: Создайте для скрипта, например, кнопку на панели TC
'Copyright: (c) 2007, aLexx
Option Explicit
Dim TCS, Clip
Set TCS = CreateObject("TCSCRIPT.Helper")
Clip = TCS.GetTextFromClip
TCS.SendCommand("cm_SearchFor")
TCS.SendKeystroke "{DELETE}" 'Очищаем строку "Что искать"
TCS.SendKeystroke "{TAB 7}" 'Переход на чек-бокс "С текстом"
TCS.SendKeystroke chr(32) 'Включаем его
TCS.SendKeystroke (Clip) 'Вносим текст из буфера обмена
TCS.SendKeystroke "{ENTER}"
Set TCS = Nothing
WScript.Quit
|
Но! В ТС7.00 и ТС7.01 заметил неприятную особенность - при вставке текста из буфера теряются некоторые
символы, например +,(,). Замена строки"TCS.SendKeystroke chr(32)" на "TCS.SendKeystroke "{^v}"" (CTRL+v -
вставить из буфера) ничего не даёт. В файле "SendKeystroke.txt" написано, что символы +, ( и ) имеют спец.
назначение. Но причём тут вставка из буфера! Тов. Volniy, что скажем?
Кстати, если врукопашную нажать CTRL+v, то всё ОК. |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Sat Jun 23, 2007 12:01 Post subject: Re: Поиск файлов, содержащих текст. |
|
|
aLexx wrote: | В файле "SendKeystroke.txt" написано, что символы +, ( и ) имеют спец. назначение. Но причём тут вставка из буфера! Тов. Volniy, что скажем? |
И действительно, причем же тут вставка из буфера? Подумай сам, откуда функция SendKeystroke может знать, что в данный момент с ее помощью выполняется именно вставка из буфера? Да ниоткуда! Посему она просто честно выполняет свою работу, посылает виртуальную серию нажатий клавиш. Если тебя не устраивает как она это делает при наличии специальных символов в строке, вытащенной из буфера обмена, тогда RTFM и предварительно помещай эти символы в фигурные скобки ({спецсимвол}). Вот так, например:
Code: | Option Explicit
Dim TCS, regEx, Clip
Set TCS = CreateObject("TCSCRIPT.Helper")
Set regEx = New RegExp
regEx.Pattern = "(\+|\^|%|~|\[|\]|\{|\})"
regEx.Global = True
regEx.IgnoreCase = True
Clip = TCS.GetTextFromClip
TCS.SendCommand("cm_SearchFor")
TCS.SendKeystroke "{DELETE}" 'Очищаем строку "Что искать"
TCS.SendKeystroke "{TAB 7}" 'Переход на чек-бокс "С текстом"
TCS.SendKeystroke chr(32) 'Включаем его
'===========
Clip = regEx.Replace(Clip, "{$1}") 'Приводим строку к корректному виду
'===========
TCS.SendKeystroke (Clip) ' Типа вносим текст из буфера обмена
TCS.SendKeystroke "{ENTER}"
Set TCS = Nothing
Set regEx = Nothing
WScript.Quit |
|
|
Back to top |
|
|
aLexx
Joined: 14 Mar 2005 Posts: 442 Location: Новокузнецк
|
(Separately) Posted: Sat Jun 23, 2007 12:58 Post subject: |
|
|
Если быть честным, про рег-экспы у меня даже мысли не возникло...
Но тут же возник вопрос - ведь текст в буфере будет изменён, правильно? Я попробую сам это исправить
Кстати, если вместо "TCS.SendKeystroke "{TAB 7}"" вставить 3 строки:
Code: |
TCS.SendKeystroke "{TAB 5}"
TCS.SendKeystroke chr(32)
TCS.SendKeystroke "{TAB 2}"
|
то поиск файлов, содержащих определённый текст, будет осуществлён и в архивах.
Об RTFM. Легко сказать, а где найти полновесную справочку, а?
2 CapitanFlint
Может темку в "Плагины"? Что-то мне чуется, не здесь ей место...
Last edited by aLexx on Sat Jun 23, 2007 13:26; edited 1 time in total |
|
Back to top |
|
|
aLexx
Joined: 14 Mar 2005 Posts: 442 Location: Новокузнецк
|
(Separately) Posted: Sat Jun 23, 2007 13:24 Post subject: |
|
|
Вот исправленный и дополненный скрипт:
Code: |
' File: FindText.vbs
' Description: Поиск файлов, содержащих текст из буфера обмена
' Requirements: WSH Helper for TC by Volniy
' Installation: Создайте для скрипта, например, кнопку на панели TC
' Copyright: (c) 2007, Volniy, aLexx
Option Explicit
Dim TCS, regEx, Clip
Set TCS = CreateObject("TCSCRIPT.Helper")
Set regEx = New RegExp
regEx.Pattern = "(\+|\(|\)|\^|%|~|\[|\]|\{|\})"
regEx.Global = True
regEx.IgnoreCase = True
Clip = TCS.GetTextFromClip
TCS.SendCommand("cm_SearchFor")
TCS.SendKeystroke "{DELETE}" 'Очищаем строку "Что искать"
TCS.SendKeystroke "{TAB 7}" 'Переход на чек-бокс "С текстом"
TCS.SendKeystroke chr(32) 'Включаем его
TCS.SendKeystroke (regEx.Replace(Clip, "{$1}")) 'Типа вносим текст из буфера обмена
TCS.SendKeystroke "{ENTER}"
Set TCS = Nothing
Set regEx = Nothing
WScript.Quit
|
Дополнены исправления для круглых скобок. Замечание про поиск в архивах остаётся в силе. |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Sat Jun 23, 2007 14:19 Post subject: |
|
|
aLexx wrote: |
Если быть честным, про рег-экспы у меня даже мысли не возникло...
Но тут же возник вопрос - ведь текст в буфере будет изменён, правильно? |
C какого перепугу? Нет, не будет.
Quote: |
Об RTFM. Легко сказать, а где найти полновесную справочку, а? |
SendKeystroke.txt ?
А вообще эта команда есть чистый враппер для SendKeys, а уж она-то нормально документирована MSDN, например в разделе по WSH. |
|
Back to top |
|
|
CaptainFlint
Joined: 14 Dec 2004 Posts: 6151 Location: Москва
|
(Separately) Posted: Sat Jun 23, 2007 21:05 Post subject: |
|
|
aLexx wrote: | Может темку в "Плагины"? Что-то мне чуется, не здесь ей место... |
Скорее, в Автоматизацию. _________________ Почему же, ё-моё, ты нигде не пишешь "ё"? |
|
Back to top |
|
|
aLexx
Joined: 14 Mar 2005 Posts: 442 Location: Новокузнецк
|
(Separately) Posted: Sat Jun 23, 2007 21:39 Post subject: |
|
|
OK
А вот ещё на скорую руку слепил скриптик, осуществляющий поиск файлов, разных по имени,
но одинаковых по содержанию (соответственно, и по размеру):
Code: |
' File: FindEqual.vbs
' Description: Поиск одинаковых файлов
' Requirements: WSH Helper for TC by Volniy
' Copyright: (c) 2007, aLexx
Option Explicit
Dim TCS
Set TCS=CreateObject("TCSCRIPT.Helper")
TCS.Pause=100
TCS.SendCommand "cm_SearchFor", False
TCS.SendKeystroke "{DELETE}" 'Очищаем строку "Искать файлы"
'TCS.SendKeystroke "{^TAB}"
TCS.SendKeystroke "{TAB 8}" 'Переход на вкладку "Дополнительно"
TCS.SendKeystroke "{RIGHT}"
TCS.SendKeystroke "{TAB 5}" 'Переход на чек-бокс "Поиск дубликатов"
TCS.SendKeystroke chr(32)
TCS.SendKeystroke "{TAB}" 'Переход на чек-бокс "по имени"
TCS.SendKeystroke chr(32)
TCS.SendKeystroke "{TAB 2}" 'Переход на чек-бокс "по содержимому"
TCS.SendKeystroke chr(32)
TCS.SendKeystroke "{ENTER}"
Set TCS = Nothing
WScript.Quit
|
По идее, в заремованной строке должно эмулироваться нажатие "CTRL+TAB", но почему-то не пашет...
Пришлось вводить восемь TAB'ов и вправо, что бы перейти на вкладку "Дополнительно".
Что я делаю не так? |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Sun Jun 24, 2007 00:53 Post subject: |
|
|
aLexx wrote: | Что я делаю не так? |
Code: | TCS.SendKeystroke "^{TAB}" |
Опять напомнить о чтении документации ? |
|
Back to top |
|
|
aLexx
Joined: 14 Mar 2005 Posts: 442 Location: Новокузнецк
|
(Separately) Posted: Sun Jun 24, 2007 05:53 Post subject: |
|
|
О, спасибки!
А в файлике "SendKeystroke.txt" о том, что модификаторы надо выносить за фигурные скобки, ни словечка...
Причём, в одном из скриптов конструкция типа "TCS.SendKeystroke "{%TAB}"" (ALT+TAB - переключение между
приложениями) работает, что и ввело меня в заблуждение...
Ученье - свет, а неученье - чуть свет, и на работу...
PS. Блин, никак не могу отправить нажатие клавиш в Блокнот...
Научите начинающего!!! |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Sun Jun 24, 2007 12:39 Post subject: |
|
|
aLexx wrote: | PS. Блин, никак не могу отправить нажатие клавиш в Блокнот...
Научите начинающего!!! |
Дело в том, что SendKeystroke заточен под отсылку нажатий клавиш именно окну Тотала (для чего, собственно он и создавался).
Используй стандартный SendKeys
Code: | Dim WshShell
set WshShell = CreateObject("wscript.Shell")
' для активации окна приложения нужно указать полный заголовок окна
WshShell.AppActivate "Untitled - Notepad"
WScript.Sleep 100
WshShell.SendKeys "Notepad is Cool!"
|
Last edited by Volniy on Sun Jun 24, 2007 20:13; edited 1 time in total |
|
Back to top |
|
|
aLexx
Joined: 14 Mar 2005 Posts: 442 Location: Новокузнецк
|
(Separately) Posted: Sun Jun 24, 2007 12:58 Post subject: |
|
|
Спасиб!!!
Счас, попробую...
А вот такое дело - у меня стоит прога, которая в заголовок окна выводит текущее время.
Значит, полное имя у активного приложения каждую секунду меняется.
Как это победить? |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Sun Jun 24, 2007 20:10 Post subject: |
|
|
aLexx wrote: | А вот такое дело - у меня стоит прога, которая в заголовок окна выводит текущее время.
Значит, полное имя у активного приложения каждую секунду меняется.
Как это победить? |
Ну так и системное время тоже ведь меняется. Так что формируй нужную строку для разыскиваемого заголовка окна программно, используя функции работы со временем. Другого выхода при использовании штатных средств я что-то не вижу.
Ну например типа такого (я же не знаю какой конкретно формат времени у тебя там):
Code: | WshShell.AppActivate "Untitled - Notepad " & Now |
PS Я исправил код в своем предыдущем сообщении, потому что понял, что я перепутал Run с отсутствующей в VBS функцией Shell. Так вот, Run не возвращает PID запущенного процесса, а возвращает код ошибки. Для AppActivate это, само собой, не катит. |
|
Back to top |
|
|
aLexx
Joined: 14 Mar 2005 Posts: 442 Location: Новокузнецк
|
(Separately) Posted: Sun Jun 24, 2007 22:28 Post subject: |
|
|
Т.к. Блокнот открываю я сам (натравляя его на текстовый файл), то проблем не возникло...
Ура! |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|