Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Поиск файлов, содержащих текст

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
aLexx



Joined: 14 Mar 2005
Posts: 442
Location: Новокузнецк

Post (Separately) Posted: Sat Jun 23, 2007 05:34    Post subject: Поиск файлов, содержащих текст Reply with quote

Есть у меня на панели кнопка, кот. осуществляет поиск файлов, содержащих определённый текст.
Этот текст предварительно занесён в буфер. Кнопка вызывает этот скрипт:

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, что скажем? Smile

Кстати, если врукопашную нажать CTRL+v, то всё ОК.
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Sat Jun 23, 2007 12:01    Post subject: Re: Поиск файлов, содержащих текст. Reply with quote

aLexx wrote:
В файле "SendKeystroke.txt" написано, что символы +, ( и ) имеют спец. назначение. Но причём тут вставка из буфера! Тов. Volniy, что скажем? Smile


И действительно, причем же тут вставка из буфера? Подумай сам, откуда функция 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
View user's profile Send private message
aLexx



Joined: 14 Mar 2005
Posts: 442
Location: Новокузнецк

Post (Separately) Posted: Sat Jun 23, 2007 12:58    Post subject: Reply with quote

Shocked Shocked Shocked
Если быть честным, про рег-экспы у меня даже мысли не возникло...
Но тут же возник вопрос - ведь текст в буфере будет изменён, правильно? Я попробую сам это исправить Smile

Кстати, если вместо "TCS.SendKeystroke "{TAB 7}"" вставить 3 строки:

Code:

TCS.SendKeystroke "{TAB 5}"
TCS.SendKeystroke chr(32)
TCS.SendKeystroke "{TAB 2}"


то поиск файлов, содержащих определённый текст, будет осуществлён и в архивах.
Об RTFM. Легко сказать, а где найти полновесную справочку, а?

2 CapitanFlint
Может темку в "Плагины"? Что-то мне чуется, не здесь ей место... Smile


Last edited by aLexx on Sat Jun 23, 2007 13:26; edited 1 time in total
Back to top
View user's profile Send private message
aLexx



Joined: 14 Mar 2005
Posts: 442
Location: Новокузнецк

Post (Separately) Posted: Sat Jun 23, 2007 13:24    Post subject: Reply with quote

Вот исправленный и дополненный скрипт:

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
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Sat Jun 23, 2007 14:19    Post subject: Reply with quote

aLexx wrote:
Shocked Shocked Shocked
Если быть честным, про рег-экспы у меня даже мысли не возникло...
Но тут же возник вопрос - ведь текст в буфере будет изменён, правильно?

C какого перепугу? Нет, не будет.
Quote:

Об RTFM. Легко сказать, а где найти полновесную справочку, а?

SendKeystroke.txt ?
А вообще эта команда есть чистый враппер для SendKeys, а уж она-то нормально документирована MSDN, например в разделе по WSH.
Back to top
View user's profile Send private message
CaptainFlint



Joined: 14 Dec 2004
Posts: 6151
Location: Москва

Post (Separately) Posted: Sat Jun 23, 2007 21:05    Post subject: Reply with quote

aLexx wrote:
Может темку в "Плагины"? Что-то мне чуется, не здесь ей место...

Скорее, в Автоматизацию.
_________________
Почему же, ё-моё, ты нигде не пишешь "ё"?
Back to top
View user's profile Send private message
aLexx



Joined: 14 Mar 2005
Posts: 442
Location: Новокузнецк

Post (Separately) Posted: Sat Jun 23, 2007 21:39    Post subject: Reply with quote

OK Smile

А вот ещё на скорую руку слепил скриптик, осуществляющий поиск файлов, разных по имени,
но одинаковых по содержанию (соответственно, и по размеру):

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", но почему-то не пашет... Sad
Пришлось вводить восемь TAB'ов и вправо, что бы перейти на вкладку "Дополнительно".
Что я делаю не так?
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Sun Jun 24, 2007 00:53    Post subject: Reply with quote

aLexx wrote:
Что я делаю не так?


Code:
TCS.SendKeystroke "^{TAB}"

Опять напомнить о чтении документации Wink ?
Back to top
View user's profile Send private message
aLexx



Joined: 14 Mar 2005
Posts: 442
Location: Новокузнецк

Post (Separately) Posted: Sun Jun 24, 2007 05:53    Post subject: Reply with quote

О, спасибки!
А в файлике "SendKeystroke.txt" о том, что модификаторы надо выносить за фигурные скобки, ни словечка... Sad
Причём, в одном из скриптов конструкция типа "TCS.SendKeystroke "{%TAB}"" (ALT+TAB - переключение между
приложениями) работает, что и ввело меня в заблуждение...

Ученье - свет, а неученье - чуть свет, и на работу... Smile

PS. Блин, никак не могу отправить нажатие клавиш в Блокнот...
Научите начинающего!!! Smile
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Sun Jun 24, 2007 12:39    Post subject: Reply with quote

aLexx wrote:
PS. Блин, никак не могу отправить нажатие клавиш в Блокнот...
Научите начинающего!!! Smile

Дело в том, что 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
View user's profile Send private message
aLexx



Joined: 14 Mar 2005
Posts: 442
Location: Новокузнецк

Post (Separately) Posted: Sun Jun 24, 2007 12:58    Post subject: Reply with quote

Exclamation Exclamation Спасиб!!!
Счас, попробую...
А вот такое дело - у меня стоит прога, которая в заголовок окна выводит текущее время.
Значит, полное имя у активного приложения каждую секунду меняется.
Как это победить?
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2584
Location: Большая деревня Москва

Post (Separately) Posted: Sun Jun 24, 2007 19:42    Post subject: Reply with quote

Насчет поиска одной кнопкой я тоже вставлю свой розовый пятачок...
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Sun Jun 24, 2007 20:10    Post subject: Reply with quote

aLexx wrote:
А вот такое дело - у меня стоит прога, которая в заголовок окна выводит текущее время.
Значит, полное имя у активного приложения каждую секунду меняется.
Как это победить?

Ну так и системное время тоже ведь меняется. Так что формируй нужную строку для разыскиваемого заголовка окна программно, используя функции работы со временем. Другого выхода при использовании штатных средств я что-то не вижу.
Ну например типа такого (я же не знаю какой конкретно формат времени у тебя там):
Code:
WshShell.AppActivate "Untitled - Notepad " & Now

PS Я исправил код в своем предыдущем сообщении, потому что понял, что я перепутал Run с отсутствующей в VBS функцией Shell. Так вот, Run не возвращает PID запущенного процесса, а возвращает код ошибки. Для AppActivate это, само собой, не катит.
Back to top
View user's profile Send private message
aLexx



Joined: 14 Mar 2005
Posts: 442
Location: Новокузнецк

Post (Separately) Posted: Sun Jun 24, 2007 22:28    Post subject: Reply with quote

Т.к. Блокнот открываю я сам (натравляя его на текстовый файл), то проблем не возникло...
Ура!
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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