<?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=4060</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=4060&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: поиск по диску и копирование файлов».]]></description>
		<lastBuildDate>Tue, 17 Jan 2012 15:04:20 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=55754#p55754</link>
			<description><![CDATA[<p>Спасибо огромное. Благодаря Вам появился большой плацдарм для размышлений и изучения:) Даже не думал что в винде есть столько всего полезного:)<br />P.S. условие не верное было, должен быть знак меньше:) Это для тех,&nbsp; кому еще будет интересен данный код.<br /></p><div class="codebox"><pre><code>CreationTime &lt; TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TIMESTAMP(&#039;0000-01-04&#039;, &#039;yyyy-MM-dd&#039;)))</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (DiabloNT)]]></author>
			<pubDate>Tue, 17 Jan 2012 15:04:20 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=55754#p55754</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=54922#p54922</link>
			<description><![CDATA[<p>Примеры запросов буду приводить для командной строки (при желании для WSH используйте ActiveX LogParser «MSUtil.LogQuery», запросы будут теми же, а результат запроса перебирается практически так же, как в ADO).</p><div class="quotebox"><blockquote><p>необходимо найти <span style="color: red">все файлы</span>, удовлетворяющие условию (пусть условием будет <span style="color: red">дата создания &lt; текущая дата - 3 дня</span>)</p></blockquote></div><div class="codebox"><pre><code>…WHERE Attributes NOT LIKE &#039;D________&#039; AND CreationTime &gt;= TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TIMESTAMP(&#039;0000-01-04&#039;, &#039;yyyy-MM-dd&#039;)))…</code></pre></div><div class="quotebox"><blockquote><p>и получить из этого списка <span style="color: red">список&nbsp; расширений файлов</span></p></blockquote></div><div class="codebox"><pre><code>SELECT Extension USING EXTRACT_EXTENSION(Path) AS Extension</code></pre></div><p>Если требуется не просто отобрать все, а получить именно уникальные, то:<br /></p><div class="codebox"><pre><code>SELECT Extension USING EXTRACT_EXTENSION(Path) AS Extension … GROUP BY Extension ORDER BY Extension ASC</code></pre></div><div class="quotebox"><blockquote><p>а таких папок порядка 10</p></blockquote></div><div class="codebox"><pre><code>…FROM &#039;E:\Песочница\0099\*.*&#039;, &#039;E:\Песочница\0100\*.*&#039;, &#039;E:\Песочница\0101\*.*&#039;…</code></pre></div><div class="quotebox"><blockquote><p>Смотрел на пост с LogQuery, но не понял правил построения запросов</p></blockquote></div><p>В комплекте инсталляции идёт файл справки с подробнейшим описанием и примерами.</p><div class="quotebox"><blockquote><p>как выбрать файлы только из одной папки, без поиска в подпапках</p></blockquote></div><div class="codebox"><pre><code>… -recurse:0 …</code></pre></div><p>То есть, у Вас должен получиться примерно такая команда:<br /></p><div class="codebox"><pre><code>&quot;C:\Program Files\Log Parser 2.2\LogParser.exe&quot; &quot;SELECT EXTRACT_EXTENSION(Path) AS Extension FROM &#039;E:\Песочница\0099\*.*&#039;, &#039;E:\Песочница\0100\*.*&#039;, &#039;E:\Песочница\0101\*.*&#039; WHERE CreationTime &gt;= TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TIMESTAMP(&#039;0000-01-04&#039;, &#039;yyyy-MM-dd&#039;))) AND Attributes NOT LIKE &#039;D________&#039; GROUP BY Extension ORDER BY Extension ASC&quot; -i:FS -q:ON -oCodepage:866 -recurse:0</code></pre></div><p>Под WSH сие может выглядеть, например, так:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim objLogQuery
Dim objFileSystemInputFormat
Dim strQuery
Dim strColumn

Set objLogQuery = WScript.CreateObject(&quot;MSUtil.LogQuery&quot;)
Set objFileSystemInputFormat = WScript.CreateObject(&quot;MSUtil.LogQuery.FileSystemInputFormat&quot;)

With objFileSystemInputFormat
    .preserveLastAccTime = True
    .recurse = False
    .useLocalTime = True
End With

strQuery = _
    &quot;SELECT EXTRACT_EXTENSION(Path) AS Extension &quot; &amp; _
    &quot;FROM &#039;E:\Песочница\0099\*.*&#039;, &#039;E:\Песочница\0100\*.*&#039;, &#039;E:\Песочница\0101\*.*&#039; &quot; &amp; _
    &quot;WHERE CreationTime &gt;= TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TIMESTAMP(&#039;0000-01-04&#039;, &#039;yyyy-MM-dd&#039;))) &quot; &amp; _
    &quot;AND Attributes NOT LIKE &#039;D________&#039; &quot; &amp; _
    &quot;GROUP BY Extension ORDER BY Extension ASC&quot;

With objLogQuery.Execute(strQuery, objFileSystemInputFormat)
    strColumn = .getColumnName(0)
    
    WScript.Echo strColumn
    WScript.Echo &quot;-----------------------------&quot;
    
    Do Until .atEnd()
        With .getRecord()
            If Not .IsNull(strColumn) Then
                WScript.Echo .toNativeString(strColumn)
            Else
                WScript.Echo &quot;(Null)&quot;
            End If
        End With
        
        .moveNext
    Loop
    
    WScript.Echo &quot;-----------------------------&quot;
    
    .close
End With

Set objFileSystemInputFormat = Nothing
Set objLogQuery              = Nothing

WScript.Quit 0</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sat, 24 Dec 2011 02:27:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=54922#p54922</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=54918#p54918</link>
			<description><![CDATA[<p>Добрый день!<br />Сложилась такая ситуация, что необходимо найти все файлы, удовлетворяющие условию (пусть условием будет дата создания &lt; текущая дата - 3 дня) и получить из этого списка список&nbsp; расширений файлов (т.к. файлов в папке около 2-3 тысяч, а таких папок порядка 10, то перебирать по одному каждый файл - не самое изящное решение, а расширения повторяются).<br />Смотрел на пост с LogQuery, но не понял правил построения запросов (что подразумевается под *, как выбрать файлы только из одной папки, без поиска в подпапках) и так же неизвестны возможности данного SQL сервера. Может кто-нибудь делал нечто похожее?<br />Понравился пост про Word.Application, появилась задумка с ним, НО ни в какую не хочет работать сортировка. Если делать макрос в офисе, то сортировка работает, если создавать vbs файл - нет, а нужен именно автономный VBS файл.<br />Надеюсь не слишком громоздкий пост.:)<br />Заранее спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (DiabloNT)]]></author>
			<pubDate>Fri, 23 Dec 2011 23:01:46 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=54918#p54918</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=52495#p52495</link>
			<description><![CDATA[<p><span style="color: Green">Перенесено, как несоответствующее теме, в отдельную тему: <a href="http://forum.script-coding.com/viewtopic.php?id=6320">VBScript: проверка существования файла</a>.</span></p>]]></description>
			<author><![CDATA[null@example.com (Francyz)]]></author>
			<pubDate>Sat, 15 Oct 2011 11:44:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=52495#p52495</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49573#p49573</link>
			<description><![CDATA[<div class="codebox"><pre><code>s(i) = f1.path
&#039;Где-то здесь…
i=i+1</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 01 Jul 2011 14:12:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49573#p49573</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49570#p49570</link>
			<description><![CDATA[<p>Большое спасибо, становится понятней.<br />Извините за назойливость, а в данном скрипте: </p><div class="codebox"><pre><code>Dim fso,mySet,myDir,st
Dim s()
i=0

Dim regEx, Match, Matches, regtxt
Set regEx = New RegExp
regEx.IgnoreCase = True
regEx.Global = True

mySet=&quot;*.hrn *.avi&quot;

For Each m1 in Split(mySet,&quot; &quot;,-1,1)
    regtxt = regtxt &amp; &quot;\.&quot; &amp; m1 &amp; &quot;$|&quot;
Next
regEx.Pattern = Left(regtxt, Len(regtxt)-1)

myDir=&quot;d:\games&quot;

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

Sub ListFolder(curDir)
On Error Resume Next
    For Each f1 in fso.GetFolder(curDir).Files
    If Err.Number = 0 Then
            If regEx.Test(f1) Then
                ReDim Preserve s(i+1)
                s(i) = f1.path
                i=i+1
            End If
    End If
    Next
Err.Clear
    For Each s1 in fso.GetFolder(curDir).SubFolders
        If Err.Number = 0 Then
            ListFolder(s1.path)
        End If
    Next
Err.Clear
On Error Goto 0
End Sub

ListFolder(myDir)

For k=0 To i-1
        MsgBox &quot;Количество файлов: &quot; &amp; i &amp; vbCrLf &amp; st
        st=k+1 &amp; &quot;) &quot; &amp; s(k) &amp; vbCrLf
Next</code></pre></div><p>Где это нужно вставить? Что бы и в лог писалось и удалялись файлы?</p>]]></description>
			<author><![CDATA[null@example.com (HABb)]]></author>
			<pubDate>Fri, 01 Jul 2011 07:50:50 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49570#p49570</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49569#p49569</link>
			<description><![CDATA[<p>Почти. Открывать файл <em>до</em> цикла обработки набора записей, писать в файл внутри цикла, закрывать — после цикла. Удалять файл можно так же внутри цикла обработки.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 01 Jul 2011 07:15:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49569#p49569</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49568#p49568</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Как обычно: с помощью «Scripting.FileSystemObject» пишете «strValue» в потребный файл, затем, при помощи него же, удаляете.</p></blockquote></div><p>Т.е. добавить в конце: </p><div class="codebox"><pre><code>Set Fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set Text = Fso.CreateTextFile(&quot;c:\log.txt&quot;)
    Text.Write strValue
    Text.Close
Fso.DeleteFile strValue</code></pre></div><p>Я правильно написал? Просто в данном случае он пишет одну строку.</p>]]></description>
			<author><![CDATA[null@example.com (HABb)]]></author>
			<pubDate>Fri, 01 Jul 2011 07:10:49 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49568#p49568</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49563#p49563</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Отчасти. На «чистом» VBScript («искаропки») — нет, только обычный рекурсивный перебор и фильтрация найденных имён посредством RegExp. При использовании вывода dir с метасимволами — обязательно огребёте проблемы с короткими именами кириллических файлов. При использовании WMI — поиск происходит глобально и дико медленно.</p><p>Лично я предпочитаю при нужде в масках использование компонента LogParser. Примеры есть на форуме.</p></blockquote></div><p>А чем плох способ с использованием метода Filter у объекта FolderItems?<br />Фильтрация найденных имен осуществляется быстро и по маске. Нет необходимости использовать регулярные выражения. Может это слишком медленно, конечно, каждому свое. Но приведенный ниже сценарий, проверив на сетевом ресурсе объемом 150Гб с 11443 папками, искал и выводил путь к каждому mp3-файлу 5 минут и 56 секунд.<br /></p><div class="codebox"><pre><code>&#039;Created by OldBoa 10:12 01.07.2011
StartTime = Timer
TotalFiles = 0
TotalFolders = 0
RootPath = &quot;w:&quot;
FindMask = &quot;*.mp3&quot;
FilesInFolder RootPath,FindMask
WScript.Echo &quot;Обработано папок: &quot; &amp; TotalFolders
WScript.Echo &quot;Найдено файлов: &quot; &amp; TotalFiles
WScript.Echo &quot;Время работы сценария: &quot; &amp; TimeBySeconds(Timer - StartTime)
Sub FilesInFolder(strFolder,strFile)
	Set objShellApp = CreateObject(&quot;Shell.Application&quot;)
	Set objFolder = objShellApp.NameSpace(strFolder)
	Set objFolderItems = objFolder.Items()
	objFolderItems.Filter 32, &quot;*&quot;
	If objFolderItems.Count &lt;&gt; 0 Then
		TotalFolders = TotalFolders + objFolderItems.Count
		For Each SubFolder In objFolderItems
			FilesInFolder SubFolder.Path,strFile
		Next
	End If
	objFolderItems.Filter 64+128, strFile
	If objFolderItems.Count &lt;&gt; 0 Then
		TotalFiles = TotalFiles + objFolderItems.Count
		For Each CurrentFile In objFolderItems
			WScript.Echo CurrentFile.Path
		Next
	End If
End Sub
Function TimeBySeconds(ttt)
	hours = ttt\3600
	minutes = (ttt-hours*3600)\60
	seconds = ((ttt-hours*3600)-minutes*60)\1
	TimeBySeconds = NeedNULL(hours) &amp; &quot;:&quot; &amp; NeedNULL(minutes) &amp; &quot;:&quot; &amp; NeedNULL(seconds)
End Function
Function NeedNULL(par)
	If Len(par) &lt; 2 Then
		NeedNULL = &quot;0&quot; &amp; par
	Else
		NeedNULL = par
	End If
End Function</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (OldBoa)]]></author>
			<pubDate>Fri, 01 Jul 2011 04:24:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49563#p49563</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49561#p49561</link>
			<description><![CDATA[<div class="quotebox"><cite>HABb пишет:</cite><blockquote><p>Как сделать так, что бы он найденные файлы записывал в C:\log.txt</p></blockquote></div><p>Как обычно: с помощью «Scripting.FileSystemObject» пишете «strValue» в потребный файл, затем, при помощи него же, удаляете.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 01 Jul 2011 02:40:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49561#p49561</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49552#p49552</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Отчасти. На «чистом» VBScript («искаропки») — нет, только обычный рекурсивный перебор и фильтрация найденных имён посредством RegExp. При использовании вывода dir с метасимволами — обязательно огребёте проблемы с короткими именами кириллических файлов. При использовании WMI — поиск происходит глобально и дико медленно.</p><p>Лично я предпочитаю при нужде в масках использование компонента LogParser. Примеры есть на форуме.</p></blockquote></div><p>Спасибо. Сам я чайник, начинающий пробовать VBS.</p><p>Нашел на просторах интернета вот такой скрипт:<br /></p><div class="codebox"><pre><code>Dim fso,mySet,myDir,st
Dim s()
i=0

Dim regEx, Match, Matches, regtxt
Set regEx = New RegExp
regEx.IgnoreCase = True
regEx.Global = True

mySet=&quot;*.hrn *.avi&quot;

For Each m1 in Split(mySet,&quot; &quot;,-1,1)
    regtxt = regtxt &amp; &quot;\.&quot; &amp; m1 &amp; &quot;$|&quot;
Next
regEx.Pattern = Left(regtxt, Len(regtxt)-1)

myDir=&quot;d:\games&quot;

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

Sub ListFolder(curDir)
On Error Resume Next
    For Each f1 in fso.GetFolder(curDir).Files
    If Err.Number = 0 Then
            If regEx.Test(f1) Then
                ReDim Preserve s(i+1)
                s(i) = f1.path
                i=i+1
            End If
    End If
    Next
Err.Clear
    For Each s1 in fso.GetFolder(curDir).SubFolders
        If Err.Number = 0 Then
            ListFolder(s1.path)
        End If
    Next
Err.Clear
On Error Goto 0
End Sub

ListFolder(myDir)

For k=0 To i-1
        MsgBox &quot;Количество файлов: &quot; &amp; i &amp; vbCrLf &amp; st
        st=k+1 &amp; &quot;) &quot; &amp; s(k) &amp; vbCrLf
Next</code></pre></div><p>Вдруг кому пригодится.</p><p>Вопрос по поводу LogParser...<br /></p><div class="codebox"><pre><code>Set oLogQuery = CreateObject(&quot;MSUtil.LogQuery&quot;)
Set oFormat = CreateObject(&quot;MSUtil.LogQuery.FileSystemInputFormat&quot;)
Set oRecordSet = oLogQuery.Execute(&quot;SELECT * FROM C:\*.mp3&quot;, oFormat)
i = 0
While Not oRecordSet.atEnd
    Set oRecord = oRecordSet.getRecord()
    strValue = oRecord.getValue(&quot;Path&quot;)
    WScript.Echo strValue
    i = i + 1
    oRecordSet.moveNext
Wend
oRecordSet.Close
WScript.Echo &quot;На диске &quot;&quot;C:&quot;&quot; найдено mp3-файлов: &quot; &amp; i</code></pre></div><p>Как сделать так, что бы он найденные файлы записывал в C:\log.txt, а потом удалял?</p>]]></description>
			<author><![CDATA[null@example.com (HABb)]]></author>
			<pubDate>Thu, 30 Jun 2011 11:19:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49552#p49552</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49551#p49551</link>
			<description><![CDATA[<p>Отчасти. На «чистом» VBScript («искаропки») — нет, только обычный рекурсивный перебор и фильтрация найденных имён посредством RegExp. При использовании вывода dir с метасимволами — обязательно огребёте проблемы с короткими именами кириллических файлов. При использовании WMI — поиск происходит глобально и дико медленно.</p><p>Лично я предпочитаю при нужде в масках использование компонента LogParser. Примеры есть на форуме.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Thu, 30 Jun 2011 09:04:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49551#p49551</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49550#p49550</link>
			<description><![CDATA[<p>Я так понимаю, готового решения для поиска файлов в подпапках по маске, на VBS не существует?</p>]]></description>
			<author><![CDATA[null@example.com (HABb)]]></author>
			<pubDate>Thu, 30 Jun 2011 08:04:46 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49550#p49550</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49346#p49346</link>
			<description><![CDATA[<p>Вообщем у меня такая проблема! </p><p>Нужно зделать так чтобы искало по всем разделам и найденые файлы заменяло файлом из пути указаной в скрипте.</p><p>Есть два скрипта у меня и никак не получаеться их связать. </p><p>Первый скрипт ищет файлы и удаляет их<br />Второй скрипт ищет файл и заменяет только первый найденый<br />А мне нужно заменять все найденые файлы на всех разделах. (ну кроме того файла который все остальные должен заменять (или он сможет сам себя заменить?) )</p><br /><div class="codebox"><pre><code>Option Explicit
&#039;Dim objArgs
Dim strFileName

&#039;If Not WScript.Arguments.Named.Exists(&quot;FileName&quot;) Then
&#039;    WScript.Echo &quot;Using: &quot; &amp; WScript.ScriptName &amp; &quot; /FileName:&lt;file for find&gt;&quot;
&#039;    WScript.Quit 1
&#039;End If

&#039;strFileName = WScript.Arguments.Named.Item(&quot;FileName&quot;)

strFileName = &quot;help.txt&quot; &#039; — имя файла для поиска писать здесь
Dim objFSO
Dim objDrive
ReDim arrPaths(0)
Dim i
Set objFSO = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
arrPaths(LBound(arrPaths)) = False
For Each objDrive In objFSO.Drives
If objDrive.DriveType = 2 Then
If objDrive.IsReady Then
FindInSubFolders objDrive.RootFolder, strFileName
End If
End If
Next
If arrPaths(LBound(arrPaths)) Then
&#039;WScript.Echo &quot;&quot; &amp; strFileName &amp; &quot;&quot;
For i = LBound(arrPaths) + 1 To UBound(arrPaths)
&#039;WScript.Echo arrPaths(i)


objFSO.DeleteFile arrPaths(i)


Next
Else
WScript.Echo &quot;Not found paths for file [&quot; &amp; strFileName &amp; &quot;].&quot;
End If
Set objFSO = Nothing
WScript.Quit 0

Sub FindInSubFolders(objFolderForFind, strFileName)
Dim objFolder
&#039;WScript.Echo objFolderForFind.Path
If objFSO.FileExists(objFSO.BuildPath(objFolderForFind, strFileName)) Then
ReDim Preserve arrPaths(Ubound(arrPaths) + 1)
arrPaths(LBound(arrPaths)) = True
arrPaths(UBound(arrPaths)) = objFSO.BuildPath(objFolderForFind, strFileName)
&#039;WScript.Echo &quot;Found file [&quot; &amp; strFileName &amp; &quot;] on folder [&quot; &amp; objFolderForFind.Path &amp; &quot;]&quot;
End If
On Error Resume Next
For Each objFolder In objFolderForFind.SubFolders
If Err.Number = 0 Then
FindInSubFolders objFolder, strFileName
Else
Err.Clear
&#039;WScript.Echo &quot;Can&#039;t enumerate subfolders for folder [&quot; &amp; objFolderForFind.Path &amp; &quot;]&quot;
End If
Next
On Error Goto 0
End Sub</code></pre></div><p>Второй скрипт</p><div class="codebox"><pre><code>Option Explicit


Dim objFSO
Dim objDrive
Dim strFileNameForFind
Dim boolDone


strFileNameForFind = &quot;help.txt&quot;                                    &#039; Имя файла для поиска.

Set objFSO   = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set objDrive = objFSO.GetDrive(&quot;h:&quot;)					&#039; Буква Раздела

WScript.Echo &quot;Find on drive &quot; &amp; objDrive.DriveLetter &amp; &quot;:...&quot;

boolDone = False
ScanSubFolders objDrive.RootFolder, strFileNameForFind               &#039; Вызываем процедуру поиска
                                                                     &#039; для корневой папки этого тома.
                                                                     &#039; Обработка вложенных папок будет
                                                                     &#039; вестись рекурсивно.

Set objDrive = Nothing
Set objFSO   = Nothing

WScript.Quit 0
&#039;=============================================================================

&#039;=============================================================================
Sub ScanSubFolders(objFolder, strFileName)
    Dim objSubFolder
    Dim strFullFileName
    
                                         &#039; Выводим путь обрабатываемой папки (для
                                                                     &#039; отладки; имеет смысл закомментировать).
    
    strFullFileName = objFSO.BuildPath(objFolder.Path, strFileName)  &#039; Строим полный путь к файлу.
    
    If objFSO.FileExists(strFullFileName) Then                       &#039; Файл существует?
        WScript.Echo vbTab &amp; &quot;Found as [&quot; &amp; strFullFileName &amp; &quot;], copying...&quot;
        
                                                                     &#039; Копируем файл
        objFSO.CopyFile objFSO.BuildPath(&quot;d:\&quot;, strFileName), strFullFileName, True
        boolDone = True
        
        Exit Sub
    End If
    
    On Error Resume Next                                             &#039; Обрабатываем ошибки, возможные в случае,
                                                                     &#039; когда нет доступа к содержимому папки
                                                                     &#039; (пример - «System Volume Information».
    For Each objSubFolder In objFolder.SubFolders
        If Err.Number = 0 Then                                       &#039; Удалось получить доступ к содержимому папки?
            On Error Goto 0                                          &#039; Восстанавливаем стандартную обработку ошибок
            
            If Not boolDone Then
                ScanSubFolders objSubFolder, strFileName             &#039; Вызываем процедуру поиска для каждой из подпапок.
            End If
        Else                                                         &#039; Если не удалось —
            Err.Clear                                                &#039; сбрасываем состояние ошибки,
            On Error Goto 0                                          &#039; восстанавливаем стандартную обработку ошибок и движемся дальше.
            WScript.Echo &quot;Can&#039;t enumerate subfolders for folder [&quot; &amp; objFolder.Path &amp; &quot;].&quot;
        End If
    Next
End Sub</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Mr_Death)]]></author>
			<pubDate>Thu, 23 Jun 2011 11:09:23 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49346#p49346</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: поиск по диску и копирование файлов]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=49038#p49038</link>
			<description><![CDATA[<p>А меня вполне устраивает использование метода Filter у объекта FolderItems.<br />Вот пример, у котором он используется. Сценарий скачивает с фтп &quot;свежий&quot; CureIt, ориентируясь на имена каталогов. Это позволяет &quot;иметь под рукой&quot; несколько релизов. Необходимость появилась после нестабильных версий сканера вирусов.<br /></p><div class="codebox"><pre><code>&#039;Created by OldBoa 10:28 29.10.2010
On Error Resume Next
Set oFtp = CreateObject(&quot;ChilkatFTP.ChilkatFTP&quot;)
If Err.Number &lt;&gt; 0 Then
    MsgBox &quot;Не установлен бесплатный COM-сервер ChilkatFTP.&quot; &amp; _
        VbCrLf &amp; &quot;http://www.chilkatsoft.com/ftp-activex.asp/&quot;
    WScript.Quit
End If
CheckDR
On Error GoTo 0
fDate = NeedNULL(Year(Date)) &amp; NeedNULL(Month(Date)) &amp; NeedNULL(Day(Date))
Destination = &quot;F:\CureIT\&quot;
LogPath = &quot;F:\CureIT\cureit_download.log&quot;
Set Dict = CreateObject(&quot;Scripting.Dictionary&quot;)
Set FSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
With oFtp
    .Hostname = &quot;ftp.drweb.com&quot;
    .Username = &quot;anonymous&quot;
    .Password = &quot;cureit_download.vbs&quot;
End With
CheckOnError(oFtp.Connect())
CheckOnError(oFtp.ChangeRemoteDir(&quot;pub/drweb/cureit&quot;))
Set objXMLDoc = CreateObject(&quot;Microsoft.XMLDOM&quot;)
objXMLDoc.async = False
CurrentDirListing = oFtp.GetCurrentDirListing(&quot;*.*&quot;)
objXMLDoc.loadXML(CurrentDirListing)
Set remoteDir = objXMLDoc.getElementsByTagName(&quot;dir&quot;)
For Each Dir In remoteDir
    For Each Child In Dir.childNodes
        CurrentString = Trim(Child.NodeValue)
        CurrentDate = Left(CurrentString,8)
        CurrentTime = Right(CurrentString,6)
        If StrComp(CurrentDate,fDate) = 0 Then
            If Not Dict.Exists(CurrentDate) Then
                Dict.Add CurrentDate, CurrentTime
            Else
                ExistsTime = Dict.Item(CurrentDate)
                ExistsHour = Left(ExistsTime,2)
                ExistsMinute = Mid(ExistsTime,3,2)
                CurrentHour = Left(CurrentTime,2)
                CurrentMinute = Mid(CurrentTime,3,2)
                If ExistsHour &lt; CurrentHour Then
                    Dict.Item(CurrentDate) = CurrentTime
                End If
                If ExistsHour = CurrentHour Then
                    If ExistsMinute &lt; CurrentMinute Then
                        Dict.Item(CurrentDate) = CurrentTime
                    End If
                End If
            End If
        End If
    Next
Next
If Dict.Count &gt; 0 Then
    For i=0 To Dict.Count-1
        Keys = Dict.Keys
        Items = Dict.Items
        FinalRemoteDir = Keys(i) &amp; Items(i)
        Set objShellApp = CreateObject(&quot;Shell.Application&quot;)
        Set objFolder = objShellApp.NameSpace(Destination)
        Set objFolderItems = objFolder.Items()
        FileName = &quot;cureit_&quot; &amp; FinalRemoteDir &amp; &quot;.exe&quot;
        CheckOnError(oFtp.ChangeRemoteDir(FinalRemoteDir))
        objFolderItems.Filter 64+128, FileName
        If objFolderItems.Count = 0 Then
            CheckOnError(oFtp.GetFile(&quot;cureit.exe&quot;,Destination &amp; FileName))
        Else
            CurrentDirListing = oFtp.GetCurrentDirListing(&quot;*.*&quot;)
            &#039;WScript.Echo oFtp.GetCurrentRemoteDir()
            objXMLDoc.loadXML(CurrentDirListing)
            Set remoteDir = objXMLDoc.getElementsByTagName(&quot;file&quot;)
            For Each Dir In remoteDir
                For Each Child In Dir.childNodes
                    Select Case Child.NodeName
                        Case &quot;size&quot; FileSize = Child.firstChild.nodeValue
                    End Select
                Next
            Next
            Set CureITFile = FSO.GetFile(Destination &amp; FileName)
            If StrComp(CureITFile.Size,Trim(FileSize)) &lt;&gt; 0 Then
                CheckOnError(oFtp.GetFile(&quot;cureit.exe&quot;,Destination &amp; FileName))
            End If
        End If
        CheckOnError(oFtp.ChangeRemoteDir(&quot;..&quot;))
    Next
End If
oFtp.Disconnect
ClearOldCureIt
Function NeedNULL(par)
    If Len(par) &lt; 2 Then
        NeedNULL = &quot;0&quot; &amp; par
    Else
        NeedNULL = par
    End If
End Function
Sub ClearOldCureIt
    Set AFolder = FSO.GetFolder(Destination)
    For Each AFile in AFolder.Files
        If DateDiff(&quot;D&quot;, AFile.DateLastModified, Now) &gt; 2 Then 
            If FSO.GetExtensionName(AFile.Path) = &quot;exe&quot; Then
                AFile.Delete True
            End If
        End If 
    Next
End Sub
Function CheckDR
    Set objSWbemServicesEx = GetObject(&quot;winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2&quot;)
    Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery(&quot;SELECT Name, CommandLine, ProcessID FROM Win32_Process WHERE &quot; &amp; _
        &quot;Name LIKE &#039;%[cw]script.exe&#039; AND CommandLine LIKE &#039;%[cw]script%&quot; &amp; WScript.ScriptName &amp; &quot;%&#039;&quot;, &quot;WQL&quot;, 0)
    If collSWbemObjectSet.Count &gt; 1 Then
        WScript.Quit
    End If
End Function
Sub WriteToLog(rectype,logtext)
    If FSO.FileExists(LogPath) then
        Set logfile = FSO.GetFile(LogPath)
        Set TextStream = logfile.OpenAsTextStream(8)
        Begin = &quot;&quot;
    Else
        Set TextStream = FSO.CreateTextFile(LogPath)
        Begin = &quot;Дата;Время;Тип записи;Комментарий&quot; &amp; VbCrLf
    End if
    TextStream.WriteLine Begin &amp; Date &amp; &quot;;&quot; &amp; Time &amp; &quot;;&quot; &amp; rectype &amp; &quot;;&quot; &amp; logtext
    TextStream.Close
End Sub
Sub CheckOnError(success)
    If (success &lt;&gt; 1) Then
        WriteToLog &quot;Ошибка&quot;,Replace(oFtp.LastErrorText,VbCrLf,&quot;&quot;)
        WScript.Quit
    End If
End Sub</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (OldBoa)]]></author>
			<pubDate>Wed, 08 Jun 2011 05:12:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=49038#p49038</guid>
		</item>
	</channel>
</rss>
