1

Тема: AHK: Поиск документа "Word" по ключевому слову

Жизнь заставила меня написать програмку для поиска файлов "Word" по ключевому слову.
Расположение файла неизвестно. Он может быть в любой из подпапок с другими подпапками.
Известна только корневая папка. Написал програмку, она прекрасно ищет  текстовые документы (.txt):


FileSelectFolder, SF,  ,  , Выберите папку для поиска
if SF=
return
InputBox, word, Поиск слова, Введите слово
if word=
return
MsgBox Данные введены!`n Для начала поиска`nнажмите "OK"
Loop, %SF%\*.txt, , 1 ; Рекурсия в подпапки.
{
V=%A_LoopFileFullPath%
	Loop, read, %V%
	{
    IfInString, A_LoopReadLine, %word%
		{
		FileAppend, %V%`n, %A_Desktop%\Поиск %word%.txt
		Break
		}
	}
}
  
MsgBox Поиск завершен`nданные сохранены`nна рабочем столе`nв файле Поиск %word%

Но при использовании ее(программы)  для поиска документов "Word" (заменяем  .txt на .docx)


Loop, %SF%\*.docx, , 1 ; Рекурсия в подпапки

Программа сходит с ума. При чтении строк файла получается " PK          ! Эь•7"( ужас!)
Происходит это из-за того что word закодирован в ANSI а скрипт читает в кодировке Unicod
Как научить AHK понимать Word не знаю. Помогите пожалуйста, очень нужно для работы.

2 (изменено: wisgest, 2018-01-22 07:36:08)

Re: AHK: Поиск документа "Word" по ключевому слову

При чтении строк файла получается " PK          ! Эь•7"( ужас!)
Происходит это из-за того что word закодирован в ANSI

Документы MS Office в новом формате (с расширениями заканчивающимися на «x») — это zip-архивы; в свою очередь содержат внутри себя xml-документы. (Ну а документы в старом формате читать как plain text тоже не очень хорошо…)

3

Re: AHK: Поиск документа "Word" по ключевому слову

wisgest, можно ли модифицировать данный скрипт так, чтобы он искал заданный список файлов с расширением .mov и копировал их в указанную директорию? Т.е. подразумевается поиск не всех файлов данного типа, а конкретных файлов по имени.

4 (изменено: sabir.yanin2014, 2016-04-22 03:11:37)

Re: AHK: Поиск документа "Word" по ключевому слову

Нашел на форуме как извлекать текст из word:


oWord := ComObjCreate("Word.Application")
Word:=oWord.Documents.Open("C:\Users\Андрей\Desktop\N2\Новая папка\1.docx")
text:=word.ActiveWindow.Document.Range().Text
Word.Close()
oWord.Quit()
msgbox,% text

Все работает отлично!
Применил код в своем скрипте:


FileSelectFolder, SF,  ,  , Выберите папку для поиска
if SF=
return
InputBox, w1, Поиск слова, Введите слово
if w1=
return
MsgBox Данные введены!`n Для начала поиска`nнажмите "OK"
Loop, %SF%\*.docx, , 1 ; Рекурсия в подпапки.
{
V=%A_LoopFileFullPath%
oWord:=ComObjCreate("Word.Application")
Word:=oWord.Documents.Open("%A_LoopFileFullPath%")
text:=word.ActiveWindow.Document.Range().Text
Word.Close()
oWord.Quit()

IfInString, text, %w1%
{
FileAppend, %V%`n, %A_Desktop%\Поиск %w1%.txt
MsgBox Поиск завершен`nданные сохранены`nна рабочем столе`nв файле Поиск %word%
Break
}
}
MsgBox Выход 

Скрипт загружается начинает работать, а как доходит до строки:


Word:=oWord.Documents.Open("%A_LoopFileFullPath%")

Выдает ошибку о том что не может найти файл. Не разрешает ссылаться на переменную?

5

Re: AHK: Поиск документа "Word" по ключевому слову

Word:=oWord.Documents.Open(A_LoopFileFullPath)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Поиск документа "Word" по ключевому слову

Задача решена. Скрипт очень мощный. Можно искать файл по нескольким словам или числам. Производительность супер!


InputBox, tip, Выберите тип файла, Введите расширение файла`,`nпо умолчанию "doc"
if tip=
tip=doc
MsgBox ".%tip%"
FileSelectFolder, SFolder,  ,  , Выберите папку для поиска
if SFolder=
return
InputBox, wd, Ввод ключей, Введите ключевые слова:`n(ввод через запятую-`nнапример:"желтый`,января`,Иванов`,563")
if wd=
return
Loop, parse, wd, `, ;узнаем количество ключей
{
if (A_Index=1)
Name:=A_LoopField
++N1
} 
MsgBox, 4, Запуск поиска, Все готово для поиска`nВы хотите продолжить?`n(Нажмите Да или Нет)
IfMsgBox No 
return

Loop, %SFolder%\*.%tip%, , 1 ; Рекурсия в подпапки.
{
DirFile=%A_LoopFileFullPath%
oWord:=ComObjCreate("Word.Application")
Word:=oWord.Documents.Open(DirFile)
text:=word.ActiveWindow.Document.Range().Text
Word.Close()
oWord.Quit()
N2=
	Loop, parse, wd, `, ;подбираем ключи
	{
	IfInString, text, %A_LoopField%
	++N2
	}
	
	if (N2=N1)
	{
	FileAppend, %word%`n%DirFile%`n, %A_Desktop%\Поиск %Name%.txt
	Break
	}
}
if (N2=N1)
MsgBox Поиск завершен`nданные сохранены`nна рабочем столе`nв файле Поиск %Name%
else
MsgBox Файл не найден