<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: Как найти текст в файле]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6661</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6661&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: Как найти текст в файле».]]></description>
		<lastBuildDate>Mon, 21 Aug 2017 13:15:14 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=118603#p118603</link>
			<description><![CDATA[<p>Может и мне поможете с моей задачей!<br />Требуется следующая тема:<br />1. Вывести содержание папки в файл new_folder.txt<br />1.1 если папка пустая, отправить письмо (test@tc.ru) что файлы отсутствуют<br />1.2 если отсутствует файл создать его<br />1.3 если содержит данные, переименовать его в old_folder.txt и отправить содержимое на почту (test@tc.ru)</p><p>2. Сравнить содержание файлов old_folder.txt и new_folder.txt<br />2.1 после сравнения определяем различия и отправляем письмо с содержимым (test@tc.ru) </p><p>как то так, помогите люди добрые у меня уже голова сломалась как это сделать</p><p>вот что пока наваял<br /></p><div class="codebox"><pre><code>Option Explicit
&#039;On Error Resume Next
Dim FolderPath
Dim objFSO
Dim objFolder
Dim colFiles
Dim objFile
Dim tf
Dim WShell

FolderPath = &quot;C:\file&quot;
Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set objFolder = objFSO.GetFolder(FolderPath)
Set colFiles = objFolder.Files
Set tf = objFSO.CreateTextFile(&quot;C:\new_folder.txt&quot;, True)

For Each objFile in colFiles
	&#039; Записать строку с переводом на новую строку.
	tf.WriteLine(objFile.Name) 
Next
tf.Close</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (stamos)]]></author>
			<pubDate>Mon, 21 Aug 2017 13:15:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=118603#p118603</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=102583#p102583</link>
			<description><![CDATA[<p><strong>delegbgk</strong><br />Тестировую на 7-ке. Никаких проблем с приложенным файлом. В процессах WINWORD.EXE нигде не весит?<br />Можете попробовать на 27 строке убрать <span style="color: green">&#039;</span><strong>, False</strong><span style="color: green">&#039;</span> с конца, но Find.Execute на моей версии Office без этого не работает.</p>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Thu, 14 Apr 2016 12:37:16 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=102583#p102583</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=102573#p102573</link>
			<description><![CDATA[<p>Огромное Вам спасибо за оказанную помощь! <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Скрипт отлично справляется с поставленной задачей, но почему-то &quot;отказывается&quot; обрабатывать определенные doc файлы. Причину мне пока не удалось обнаружить.&nbsp; Просто викидывает ошибку &quot;error on close&quot;, хотя файл не занят другим процессом или пользователем, вне зависимости от прав пользователя на файл или содержимое файла, также пробовал менять владельца и реквизиты самого документа - безрезультатно. <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /><br />Думал что причина может быть в версии офиса или windows, но что на 10тке, что на хр результат тот же.</p>]]></description>
			<author><![CDATA[null@example.com (delegbgk)]]></author>
			<pubDate>Thu, 14 Apr 2016 06:16:08 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=102573#p102573</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=102410#p102410</link>
			<description><![CDATA[<p><strong>delegbgk</strong><br />Допустим (без Excel пока):<br /></p><div class="codebox"><pre><code>&#039; Поиск строк в документах с выводом в лог

Option Explicit: Dim List, Folder, LogFile, FSO, Dict,_
ShAp, Word, Verb, LogStream, F, Items, I, Doc, Sel, Key

List = &quot;C:\names.txt&quot;         &#039; путь к списку нужных строк
Folder = &quot;C:\files&quot;           &#039; путь к папке с документами
LogFile = Date &amp; &quot; FOUND.log&quot; &#039; имя лога рядом со скриптом

Set FSO  = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set Dict = CreateObject(&quot;Scripting.Dictionary&quot;)
Set ShAp = CreateObject(&quot;Shell.Application&quot;)
Set Word = CreateObject(&quot;Word.Application&quot;)
Word.Visible = False : Verb = &quot;сформирован&quot;
If FSO.FileExists(LogFile) Then Verb = &quot;переписан&quot;
Set LogStream = FSO.CreateTextFile(LogFile, True, True)
With FSO.OpenTextFile(List)
  Do : F = .ReadLine
    Dict.Add F, &quot;&quot;
  Loop Until .AtEndOfStream : .Close
End With

Set Items = ShAp.NameSpace(Folder).Items
Items.Filter 8256,  &quot;*.doc;*.docx;*.rtf&quot;
For Each I In Items
  If Left(I.Name, 2) &lt;&gt; &quot;~$&quot; Then
    Set Doc = Word.Documents.Open(I.Path, False, False)
    Set Sel = Word.Selection
    For Each Key In Dict.Keys
      Sel.Find.Text = CStr(Key) : Sel.Find.Forward = True
      Sel.Find.MatchWholeWord = True : If Sel.Find.Execute Then _
      LogStream.WriteLine CStr(Key) &amp; &quot; in &quot; &amp; I : Exit For
    Next : Doc.Close
  End If
Next : Word.Quit : LogStream.Close
If MsgBox(&quot;Лог файл &quot; &amp; Verb &amp; &quot;. Желаете открыть?&quot;, 4132,_
&quot;Создание лога по наличию строк в файлах      &quot;) = 6 Then _
ShAp.ControlPanelItem LogFile</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Fri, 08 Apr 2016 14:14:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=102410#p102410</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=102399#p102399</link>
			<description><![CDATA[<p><strong>Flasher</strong><br /></p><div class="codebox"><pre><code>
Вопрос: нужно искать каждое число в файлах отдельно или всё же для индикации присутствия достаточно найти первое попавшееся?
</code></pre></div><p>Думаю,<strong> &quot;для индикации присутствия достаточно найти первое попавшееся&quot;</strong> - так как <strong>нужно отсеять по списку файлы в которых, присутствует, хотя бы одна из строк указанная в списке</strong>, от файлов в которых нет ни одной из строк указанных в списке. И, наверное, такой способ на деле будет побыстрее первого (искать каждое число в файлах отдельно) так как при нахождении совпадения, скрипт будет переходить к следующему по очереди файлу.<br />Надеюсь, что понятно объяснил. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br /></p><div class="codebox"><pre><code>Проще - не проще, но при 500 файлах лог получится примерно с 2,5 млн строками размером до 0,5 Гб.</code></pre></div><p>С этим уж точно не поспоришь <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />! Но я пока что на стадии изучения работы массивов и коллекций (Объект Scripting.Dictionary), если я удачно погуглил и нашел действительно то, на что вы мне указали. Поэтому уверенности в том что мой скрипт будет &quot;правильно&quot; обрабатывать 2-3 файла и находить в них строки из списка у меня нет. Но если, скрипт изначально будет работать без ошибок, тогда во втором логе изначально нет необходимости <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />.</p>]]></description>
			<author><![CDATA[null@example.com (delegbgk)]]></author>
			<pubDate>Fri, 08 Apr 2016 07:09:55 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=102399#p102399</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=102395#p102395</link>
			<description><![CDATA[<div class="quotebox"><cite>delegbgk пишет:</cite><blockquote><p>во всяком случае так проще</p></blockquote></div><p>Проще - не проще, но при 500 файлах лог получится примерно с 2,5 млн строками размером до 0,5 Гб.</p><p>Вопрос: нужно искать каждое число в файлах отдельно или всё же для индикации присутствия достаточно найти первое попавшееся?</p>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Thu, 07 Apr 2016 21:21:44 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=102395#p102395</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=102391#p102391</link>
			<description><![CDATA[<p><strong>Flasher</strong> 2 лог - временно, чтобы можно было проанализировать работу скрипта(ну мне пока что, во всяком случае так проще).<br />&quot;Там не массивы, а коллекции будут.&quot;<br />А можно пример &quot;коллекции&quot; привести? Вроде как косвенно ознакомился с основами vbs, но пока что о таком не слышал. Возможно есть более простое решение задачи?</p>]]></description>
			<author><![CDATA[null@example.com (delegbgk)]]></author>
			<pubDate>Thu, 07 Apr 2016 20:05:30 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=102391#p102391</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=102372#p102372</link>
			<description><![CDATA[<p><strong>delegbgk</strong><br />Там не массивы, а коллекции будут.<br />А зачем во второй лог писать всё, что не попало из 5000 строк? Это ж кошмар, какая могучая кучка получится. <img src="//forum.script-coding.com/img/smilies/hmm.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Thu, 07 Apr 2016 13:49:24 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=102372#p102372</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=102357#p102357</link>
			<description><![CDATA[<p><strong>BeS Yara</strong><br />Подскажите пожалуйста, как решить такую нетривиальную задачу:<br />Есть файл: C:\names.txt, в нем около 5тыс строк с цифрами без разделителей(капс, пробелы, запятые и прочие), т.е. примерно следующее:<br /></p><div class="codebox"><pre><code>23254544
66544886
5466645465
4456645465
.............</code></pre></div><p>Есть много файлов с расширениями .doc, .docx,xls,xlsx и .rtf с произвольными названиями (кириллическими, с пробелами в названии и.т.п). Все они находятся в папке C:\files\*<br />Я хочу написать скрипт, который будет проверять, присутствуют ли строки файла names.txt в документах и электронных таблицах которые находятся в папке C:\files\*.</p><p>Понимаю, что мне нужно огласить два массива: строки из файла names.txt&nbsp; и файлы из папки C:\files\*.<br />Затем, огласив классы к которым эти массивы принадлежат, нужно огласить цикл внутри цикла с условием: если элемент массива names.txt найден в файле C:\files\1.doc, тогда вывести имя этого элемента и имя файла в лог C:\found.log в виде:<br /></p><div class="codebox"><pre><code>
5466645465 in 1.doc
</code></pre></div><p>Иначе перейти к внешнему циклу т.е. к следующему файлу.<br />К сожалению, в vbs рублю на порядок хуже, чем в batch-скриптах, поэтому буду решать свою задачу под присмотром гуру. (Кстати, если у вас есть скрипт, решающий похожую задачу, буду очень благодарен за оказанную помощь).</p><p>Пока что имею простенький скрипт, который открывает указанный документ, ищет в нем указанную строку и выводит сообщение в соответствующий лог, который создается в текущей для скрипта папке:<br /></p><div class="codebox"><pre><code>dim oFso, oShell, oShellEnv
set oFso      = CreateObject(&quot;Scripting.FileSystemObject&quot;)
set oShell    = WScript.CreateObject(&quot;WScript.Shell&quot;)
sLogFile1 = sCurFolder &amp; Date() &amp; &quot; FOUND&quot;  &amp; &quot;.log&quot; &#039; лог для найденой строчки
sLogFile2 = sCurFolder &amp; Date() &amp; &quot; NOT FOUND&quot;  &amp; &quot;.log&quot; &#039;лог для не найденой строчки
set oTS1 = oFSO.CreateTextFile(sLogFile1, true) &#039; true - overwrite
set oTS2 = oFSO.CreateTextFile(sLogFile2, true) &#039; true - overwrite
Set objWord = CreateObject(&quot;Word.Application&quot;)
objWord.Visible = False

Set objDoc = objWord.Documents.Open(&quot;D:\111\1.doc&quot;)
Set objSelection = objWord.Selection

objSelection.Find.Text = &quot;25477191&quot;
objSelection.Find.Forward = TRUE
objSelection.Find.MatchWholeWord = TRUE

If objSelection.Find.Execute Then
    oTS1.WriteLine objSelection.Find.Text
Else
    oTS2.WriteLine objSelection.Find.Text
End If
objDoc.Close</code></pre></div><p>Осталось совсем &quot;ничего&quot; <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />, огласить 2 массива(для текстового файла, и для папки с документами) и подружить их в двух циклах: первый по очереди ищет строки из текстового файла в документе, второй(внешний) перебирает документы из массива(из папки).</p>]]></description>
			<author><![CDATA[null@example.com (delegbgk)]]></author>
			<pubDate>Wed, 06 Apr 2016 18:54:23 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=102357#p102357</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55553#p55553</link>
			<description><![CDATA[<p>Скажем так, условие было некорректно, т.к. проверка должна была срабатывать только в конце файла, а не на каждой строке <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Ну и немаловажно - чтение было за пределами цикла, т.е. считывалась одна единственная строка. И без ошибочного Else цикл получался ещё и бесконечный(т.к. прочитали лишь первую строку, то AtEndOfStream не дождались бы).<br />Можно конец файла обработать и в цикле(тоже рабочий вариант):<br /></p><div class="codebox"><pre><code>option explicit
Dim objFSO, txtFile, x
Set objFSO = Createobject(&quot;Scripting.FileSystemObject&quot;)
Set txtFile = objFSO.OpenTextFile(&quot;echo.txt&quot;,1)

Do  While Not txtFile.AtEndOfStream
  x=txtFile.Readline
  If InStr(x, &quot;текст2&quot;) Then
      MsgBox &quot;Нашли второй&quot;
      Exit Do
    Elseif InStr(x, &quot;текст5&quot;) Then
      Msgbox &quot;Нашли пятый&quot;
      Exit Do
    ElseIf txtFile.AtEndOfStream Then Msgbox &quot;Этих строчек в файле нет&quot;
  End If
Loop

txtFile.Close</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Wed, 11 Jan 2012 13:16:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55553#p55553</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55552#p55552</link>
			<description><![CDATA[<div class="quotebox"><cite>BeS Yara пишет:</cite><blockquote><p>1. Читать строку нужно в цикле.<br />2. В цикле Else лишний, т.к. если первая строка не совпадает ни с одним из вариантов, то происходит выход из цикла.</p></blockquote></div><p>Спасибо, работает. Понял свою ошибку - указывал лишний Else.<br />Ещё раз большое спасибо!!!</p>]]></description>
			<author><![CDATA[null@example.com (kolins)]]></author>
			<pubDate>Wed, 11 Jan 2012 12:51:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55552#p55552</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55550#p55550</link>
			<description><![CDATA[<p>1. Читать строку нужно в цикле.<br />2. В цикле Else лишний, т.к. если первая строка не совпадает ни с одним из вариантов, то происходит выход из цикла.<br /></p><div class="codebox"><pre><code>option explicit
Dim objFSO, txtFile, x, done
Set objFSO = Createobject(&quot;Scripting.FileSystemObject&quot;)
Set txtFile = objFSO.OpenTextFile(&quot;echo.txt&quot;,1)

Do While Not txtFile.AtEndOfStream
  x=txtFile.Readline
  If InStr(x, &quot;текст2&quot;) Then
      MsgBox &quot;Нашли второй&quot;
      done = true
      Exit Do
    Elseif InStr(x, &quot;текст5&quot;) Then
      Msgbox &quot;Нашли пятый&quot;
      done = true
      Exit Do
&#039;    Else Msgbox &quot;Этих строчек в файле нет&quot;
&#039;      Exit Do
  End If
Loop
If Not done Then Msgbox &quot;Этих строчек в файле нет&quot;
txtFile.Close</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Wed, 11 Jan 2012 12:32:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55550#p55550</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55548#p55548</link>
			<description><![CDATA[<p>Не работает. Точнее работает, но выдает сразу &quot;Этих строчек в файле нет&quot;.</p><p>[добавлено]</p><p>Скрипт работает, если 1я строчка в файле равна нашей искомой строке.<br />&nbsp; &nbsp; &nbsp; <br /></p><div class="codebox"><pre><code> Set objFSO = Createobject(&quot;Scripting.FileSystemObject&quot;) 
   Set txtFile = objFSO.OpenTextFile(FileName,1) 

x=txtFile.Readline

    Do While Not txtFile.AtEndOfStream
                If InStr(x, &quot;текст2&quot;) Then 
                     MsgBox &quot;Нашли второй&quot;
                     Exit Do 
               Elseif InStr(x, &quot;текст5&quot;) Then 
                     Msgbox &quot;Нашли пятый&quot;
                       Exit Do  
               Else Msgbox &quot;Этих строчек в файле нет&quot; 
          Exit Do
          End If
    Loop
   txtFile.Close
 End Sub</code></pre></div><p>1я строчка в файле &quot;текст5&quot; - выдает сообщение &quot;Нашли пятый&quot;.<br />1я строчка в файле &quot;текст2&quot; - выдает сообщение &quot;Нашли второй&quot;.<br />1я строчка в файле &quot;текст1&quot; - выдает сообщение &quot;Этих строчек в файле нет&quot;.</p><p>Получается, что проверяется только 1я строчка. Может быть я не тот что-то указал перед if?<br />Как решить проблему? <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (kolins)]]></author>
			<pubDate>Wed, 11 Jan 2012 11:56:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55548#p55548</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55530#p55530</link>
			<description><![CDATA[<p>x=txtFile.ReadLine<br />If InStr(x, &quot;текст2&quot;) Then <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MsgBox &quot;Нашли второй&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exit Do <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Elseif InStr(x, &quot;текст5&quot;) Then <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Msgbox &quot;Нашли пятый&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Exit Do&nbsp; <br />&nbsp; &nbsp; &nbsp; Else Msgbox &quot;Этих строчек в файле нет&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; End If</p>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Wed, 11 Jan 2012 08:13:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55530#p55530</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Как найти текст в файле]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55528#p55528</link>
			<description><![CDATA[<div class="quotebox"><cite>chichva пишет:</cite><blockquote><p>Где то так:</p></blockquote></div><p>В том то и дело, а что писать вместо &quot;...&quot;?</p><p>Там какая-то такая должна быть схема</p><div class="codebox"><pre><code>      
Do While Not txtFile.AtEndOfLine
          If InStr(txtFile.ReadLine, текст2) Then 
               MsgBox &quot;Нашли второй&quot;
               Exit Do 
          Elseif InStr(txtFile.ReadLine, текст5) Then 
               Msgbox &quot;Нашли пятый&quot;
               Exit Do  
      Else Msgbox &quot;Этих строчек в файле нет&quot;
          End If 
     Loop
   txtFile.Close</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (kolins)]]></author>
			<pubDate>Wed, 11 Jan 2012 07:55:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55528#p55528</guid>
		</item>
	</channel>
</rss>
