<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: поиск в строке и удаление этой строки]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7519&amp;type=atom" />
	<updated>2012-09-16T05:41:07Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=7519</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63889#p63889" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>griha09 пишет:</cite><blockquote><p>Спасибо dab00 за коменты</p></blockquote></div><p>Рад, что Вам помогло. Уже очень похоже <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />. Примерно о таком алгоритме чуть выше толковал уважаемый <strong>Rumata</strong>.</p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2012-09-16T05:41:07Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63889#p63889</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63886#p63886" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>и кстати файл otchet нельзя размещать в этом же каталоге т.к. скрипт проходит все файлы каталога и будет бесконечно копировать строки из otchet в otchet</p></blockquote></div><p>Можно, если сие учесть — проверяя имя файла.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-09-15T18:24:43Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63886#p63886</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63885#p63885" />
			<content type="html"><![CDATA[<p>Спасибо dab00 за коменты, но заменой sw на word в строке&nbsp; strNewText = Replace(strText, sw, &quot; &quot;) проблему не решишь, т.к. будет удалять только слово word а нам надо всю строку sw. Так что я решил не мучаться а просто копировать в др. файл все строки не содержащие искомое слово word<br /> </p><div class="codebox"><pre><code>word = &quot;Source&quot;                 &#039;искомое слово
papka = &quot;c:\temp\&quot;            &#039;папка поиска
otchet = &quot;D:\\test\\otchet.txt&quot;        &#039;файл отчета
i=0




Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set file2 = objFSO.OpenTextFile(otchet, 2, True) 


RecursiveFolderScan papka
file2.close

Msgbox &quot;ВСЕ! Обработано &quot;&amp; i &amp;&quot; файлов&quot;




Sub RecursiveFolderScan(FolderPath)
    &#039;Получаем объектную модель текущего каталога
    Set Folder = objFSO.GetFolder(FolderPath)
 
    &#039;Перебираем все файлы в текущем каталоге
    For Each File in Folder.Files
&#039;+++++++++++++++++++++++++++++++++++++++++

Set file1 = objFSO.OpenTextFile(File, 1, False)

Do Until file1.AtEndOfStream
sw = file1.ReadLine()

If InStr(1, sw, word) = 0 Then    &#039;копируем в др. файл все строки не равные этой
                
&#039;file2.WriteLine(file.Name)         
file2.WriteLine(sw)     
                
            End If
        Loop
file1.close
 

objFSO.DeleteFile File, 1    &#039;удаляем исход.файл
&#039;objFSO.MoveFile otchet, File    &#039;почему-то выдает ошибку  переимен-м отчет в исход.файл




i=i+1        &#039;счетчик файлов
&#039;++++++++++++++++++++++++++++++++++++++



    Next
 
    &#039;Перебираем все подкаталоги в каталоге
    For Each SubFolder in Folder.SubFolders
        RecursiveFolderScan(SubFolder.Path)
    Next
End Sub</code></pre></div><p>и кстати файл otchet нельзя размещать в этом же каталоге т.к. скрипт проходит все файлы каталога и будет бесконечно копировать строки из otchet в otchet</p>]]></content>
			<author>
				<name><![CDATA[griha09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27540</uri>
			</author>
			<updated>2012-09-15T17:37:38Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63885#p63885</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63671#p63671" />
			<content type="html"><![CDATA[<p><strong>Rumata</strong><br />Зависание системы на очень больших файлах, может, и будет, если не стоит автоопустошитель оперативки. Поскольку речь о тексте, думается, что файлы не настолько большие, чтобы вызвать сбой. У меня таких нет, по крайней мере. Хотя у некоторых админов имеются очень большие логи, но это редкость. И, естественно, нужно чистить (Nothing) переменную с содержимым после каждой записи.</p><p><strong>dab00</strong><br />Так не получится. <em>sw</em> в функции замены будет принимать значение последней строки ( а не каждой в отдельности) обрабатываемого файла. Там же цикл в цикле. Тут регексы нужны.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2012-09-08T20:58:00Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63671#p63671</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63665#p63665" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>griha09 пишет:</cite><blockquote><p>Вот никак не могу придумать как переделать его чтоб удалял строки со всеми искомыми словами в файле.</p></blockquote></div><p>Я закомментировал Ваш скрипт таким образом, чтобы дочитав текст скрипта до конца Вы решили вопрос.<br /></p><div class="codebox"><pre><code>
word = &quot;Source:&quot; &#039;искомое слово
papka = &quot;c:\temp\&quot; &#039;папка поиска

otchet = &quot;otchet.txt&quot; &#039;файл отчета - поместим его в каталог скрипта для простоты
i = 0 &#039;счетчик файлов

Dim boolFound &#039;флаг - слово найдено

Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)

&#039;---не понял причем тут RegExp
&#039;Set objRegExp = CreateObject(&quot;VBScript.RegExp&quot;)
&#039;objRegExp.IgnoreCase = True

Set file2 = objFSO.OpenTextFile(otchet, 2, True)

RecursiveFolderScan papka

file2.close

Msgbox &quot;ВСЕ! Обработано &quot;&amp; i &amp;&quot; файлов&quot;



Sub RecursiveFolderScan(FolderPath)
    &#039;Получаем объектную модель текущего каталога
    Set Folder = objFSO.GetFolder(FolderPath)
 
    &#039;Перебираем все файлы в текущем каталоге
    For Each File in Folder.Files

		Set file1 = objFSO.OpenTextFile(File, 1, False) &#039;читаем файл
		boolFound = False

		Do Until file1.AtEndOfStream
			sw = file1.ReadLine() &#039;по-строчно
			If InStr(1, sw, word) &lt;&gt; 0 Then
				boolFound = True &#039;слово найдено
				file2.WriteLine(file.Name) &#039;пишем в отчет имя файла      
				file2.WriteLine(sw) &#039;пишем в отчет всю строку
				Exit Do &#039;выходим из цикла - скрипт пишет в отчет только строку с первым словом
			End If
        Loop
		file1.close &#039;закрываем файл

		&#039;записать уникальный номер в конец исходной страницы
		If boolFound Then
			Set file1 = objFSO.OpenTextFile(File, 1, False) &#039;снова читаем тот же файл
			strText = file1.ReadAll &#039;читаем все содержимое в переменную			
			file1.close &#039;и опять закрываем
			&#039;меняем все вхождения найденной строки на пробел - а надо наверное искомого слова - word
			strNewText = Replace(strText, sw, &quot; &quot;) 			
			
			&#039;снова открываем тот же файл - на этот раз для записи - таким образом удаляя все содержимое файла
			Set file1 = objFSO.OpenTextFile(File, 2, False)
			file1.WriteLine strNewText &#039;пишем новое содержимое
			file1.close &#039;и закрываем в третий раз
		End If	

		i = i + 1 &#039;счетчик файлов
    Next
 
    &#039;Перебираем все подкаталоги в каталоге
    For Each SubFolder in Folder.SubFolders
        RecursiveFolderScan(SubFolder.Path)
    Next
End Sub</code></pre></div><p>Постарался ничего не менять в первоначальном коде, чтобы уважаемый griha09 сумел сам разобраться.</p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2012-09-08T19:23:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63665#p63665</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63663#p63663" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>smaharbA пишет:</cite><blockquote><p>Могу читать и писать одновременно</p></blockquote></div><p>Коллега, обратите внимание на всю фразу: </p><div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Вы не можете читать и писать одновременно в один и тот же файл, так чтобы удалить определенные строки, а остальные оставить</p></blockquote></div><p><strong>Flasher</strong><br />Согласен. Но что будет с очень большими файлами? Не будет ли зависания скрипта или аварийного завершения по нехватке памяти?</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2012-09-08T17:33:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63663#p63663</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63661#p63661" />
			<content type="html"><![CDATA[<p><strong>smaharbA</strong>, поясните — при помощи «TextStream»?</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-09-08T16:16:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63661#p63661</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63659#p63659" />
			<content type="html"><![CDATA[<p>Не знаю к чему флуд, но <strong>Rumata</strong> имел в виду, что после открытия файла на запись читать его уже не имеет смысла (он будет пустовать), поэтому перебирать построчно так не получится. Вот я и пишу что надо запонимать в переменной весь исправленный текст, а потом его целиком записывать.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2012-09-08T15:46:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63659#p63659</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63658#p63658" />
			<content type="html"><![CDATA[<p>Могу читать и писать одновременно - я Юлий Цезарь ?</p>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2012-09-08T15:23:28Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63658#p63658</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63657#p63657" />
			<content type="html"><![CDATA[<p><strong>griha09</strong><br />Не вдаваясь в технические подробности: нужно не строки в цикле перебирать, а сразу заменять через RegExp.Replace в ReadAll всю комбинацию <em>* искомое слово * vbNewline</em> на <em>&quot; &quot; vbNewline</em>.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2012-09-08T15:01:52Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63657#p63657</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63484#p63484" />
			<content type="html"><![CDATA[<p><strong>griha09</strong><br />Вы не можете читать и писать одновременно в один и тот же файл, так чтобы удалить определенные строки, а остальные оставить. Для этого и используется временный файл, в который пишутся все строки, кроме указанных. После завершения чтения входного файла он и временный закрываются, а временный файл перемещается в оригинальный..</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2012-09-03T18:32:57Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63484#p63484</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63483#p63483" />
			<content type="html"><![CDATA[<p><strong>Rumata</strong><br />вообще-то мне надо удалить все строки (заменить на &quot; &quot;), содержащие заданную подстроку, а не сохранить их в др.файл. А могу,&nbsp; конечно, записать в др. файл строки не содержащие заданную подстроку, но тут уже просто интересно как модифицировать именно этот скрипт на замену всех строк а не только первой с заданной подстрокой.</p>]]></content>
			<author>
				<name><![CDATA[griha09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27540</uri>
			</author>
			<updated>2012-09-03T18:17:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63483#p63483</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63439#p63439" />
			<content type="html"><![CDATA[<p><strong>griha09</strong><br />Опишу алгоритм словесно. Полагаю, что по нему реализацию Вы осилите. Будут вопросы - задавайте.</p><div class="codebox"><pre><code>получить список файлов в переменную files

for each file in files
    create tempfile // создать временный файл и открыть на запись
    file.open // открыть файл на чтение
    while not EOF file
        line = file.ReadLine
        if line содержит заданную подстроку then
            выполнить какие-то действия (например, запись в лог-файл о нахождении заданной подстроки)
            пропустить, перейти к следующей строке
        end if
        tempfile.WriteLine line // сохранить строку во временном файле
    end while
    file.Close // закрыть файл
    tempfile.Close // закрыть временный файл
    rename tempfile file // переименовать временный файл в файл
end for</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2012-09-02T12:25:47Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63439#p63439</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63435#p63435" />
			<content type="html"><![CDATA[<p><a href="http://www.script-coding.com/WSH/RegExp.html">RegExp</a></p>]]></content>
			<author>
				<name><![CDATA[dab00]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27085</uri>
			</author>
			<updated>2012-09-02T12:05:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63435#p63435</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS: поиск в строке и удаление этой строки]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63426#p63426" />
			<content type="html"><![CDATA[<p>есть скрипт который в каждом файле папки ищет&nbsp; строку с заданным словом word и удаляет эту строку, но он удаляет только&nbsp; строку с первым искомым словом в файле, а остальные оставляет. Вот никак не могу придумать как переделать его чтоб удалял строки со всеми искомыми словами в файле.<br /></p><div class="codebox"><pre><code>word = &quot;Source:&quot;                 &#039;искомое слово
papka = &quot;c:\temp\&quot;            &#039;папка поиска
otchet = &quot;D:\\временное\\WSH\\test\\otchet.txt&quot;        &#039;файл отчета
i=0

Dim boolFound



Set objFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set objRegExp = CreateObject(&quot;VBScript.RegExp&quot;)
objRegExp.IgnoreCase = True
Set file2 = objFSO.OpenTextFile(otchet, 2, True)  &#039;2 - Открыть файл для записи. Если файл уже существовал, его содержимое теряется. 8 - Открыть файл для добавления. Если файл уже существовал, информация будет дописываться в конец файла.Создавать файл, если он не существует (True), или нет (False). 


RecursiveFolderScan papka
file2.close

Msgbox &quot;ВСЕ! Обработано &quot;&amp; i &amp;&quot; файлов&quot;



Sub RecursiveFolderScan(FolderPath)
    &#039;Получаем объектную модель текущего каталога
    Set Folder = objFSO.GetFolder(FolderPath)
 
    &#039;Перебираем все файлы в текущем каталоге
    For Each File in Folder.Files

Set file1 = objFSO.OpenTextFile(File, 1, False)
boolFound = False

Do Until file1.AtEndOfStream
sw = file1.ReadLine()

If InStr(1, sw, word) &lt;&gt; 0 Then
                boolFound = True
file2.WriteLine(file.Name)         
file2.WriteLine(sw)     
                Exit Do
            End If
        Loop
file1.close
 

&#039;записать уникальный номер в конец исходной страницы
    If boolFound Then
Set file1 = objFSO.OpenTextFile(File, 1, False)
strText = file1.ReadAll
file1.close
strNewText = Replace(strText, sw, &quot; &quot;)          
                                      
Set file1 = objFSO.OpenTextFile(File, 2, False)
file1.WriteLine strNewText
file1.close

    End If


i=i+1        &#039;счетчик файлов




    Next
 
    &#039;Перебираем все подкаталоги в каталоге
    For Each SubFolder in Folder.SubFolders
        RecursiveFolderScan(SubFolder.Path)
    Next
End Sub</code></pre></div>]]></content>
			<author>
				<name><![CDATA[griha09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27540</uri>
			</author>
			<updated>2012-09-02T10:49:21Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63426#p63426</id>
		</entry>
</feed>
