1

Тема: WSH: Поиск файлов по маске на сервере

Доброго времени суток!
Поставили мне цель - написать скрипт, который бы искал медиа-файлы на сервере по маске, составлял их список и отсылал его администратору. У кого-нибудь есть идеи по осуществлению данного задания? В какую сторону копать? VBS знаю достаточно поверхностно

2

Re: WSH: Поиск файлов по маске на сервере

nostro, администратор имеет доступ к серверу?

3 (изменено: nostro, 2011-10-18 16:14:02)

Re: WSH: Поиск файлов по маске на сервере

Имеет. Как говориться, можно и руками чистить, но руководство требует скрипт...

UPD: накопал в интернете такой вот скриптик:

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="*.fb2 *.bin *.cue" ' Список расширений, которые ищутся

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

myDir="c:\123" ' Путь для поиска

Set fso = CreateObject("Scripting.FileSystemObject")

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
    If Len("Количество файлов: " & i & vbCrLf & st & k+1 & ") " & s(k) & vbCrLf)<1000 Then
        st=st & k+1 & ") " & s(k) & vbCrLf
    Else
        MsgBox "Количество файлов: " & i & vbCrLf & st
        st=k+1 & ") " & s(k) & vbCrLf
    End If
Next
 
MsgBox "Количество файлов: " & i & vbCrLf & st

Как сделать так, чтобы результат не на экран выводился, а в файл, который бы слался на определенное мыло?

4

Re: WSH: Поиск файлов по маске на сервере

Я бы предложил два варианта, куда более удобных:

* использовать Far Manager (неограниченные возможности фильтрации при поиске; найденным можно сразу же и манипулировать);
* использовать Log Parser:
CMD/BAT: отчёт по свойствам файлов по маске с помощью Log Parser
VBScript: утилита LogParser от Microsoft, COM-интерфейс
VBScript: работаем с утилитой LogParser от Microsoft.

Думаю, сие будет проще и удобнее.

5

Re: WSH: Поиск файлов по маске на сервере

А с помощью логпарсера можно указать список расширений, по которым исакть нужно? А то я пока нашел кучу примеров, где ищут файлы с одинаковым расширением, но не по списку расширений...

6

Re: WSH: Поиск файлов по маске на сервере

nostro, документацию не пробовали читать?

LogParser.exe "SELECT TOP 50 Path, Size FROM c:\*.bmp, c:\*.jpg ORDER BY Size DESC" -i:FS

7

Re: WSH: Поиск файлов по маске на сервере

А есть где-нибудь документация по использованию логпарсера в VBS?

8 (изменено: dab00, 2011-10-18 20:50:27)

Re: WSH: Поиск файлов по маске на сервере

Через WMI можно следующим образом:


Option Explicit
Const strComputer = "." 'имя Вашего сервера
Const strDrive = "D:" 'целевой диск
Const strExtension = "mp3" 'целевое расширение
Const strPath = "Share" 'целевой каталог
Const strLogFileName = "MP3Log.txt" 'имя файла лога

Dim objWMI, wshShell, fso, objFiles, objFile, objLogFile, i
Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objFile = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set wshShell = CreateObject("WScript.Shell")

'выполняем запрос к WMI
Set objFiles = objWMI.ExecQuery("SELECT * FROM CIM_DataFile WHERE Drive = '" & strDrive & _
		"' AND Path = '\\" & Replace(strPath,"\","\\") & "\\' AND Extension = '" & strExtension & "'")

'если хотите получить информацию обо всех файлах на диске - раскомментируйте этот запрос 
'и закомментируйте или удалите предыдущий
'Set objFiles = objWMI.ExecQuery("SELECT * FROM CIM_DataFile WHERE Drive = '" & strDrive & _
'		"' AND Extension = '" & strExtension & "'")

'создаем файл
Set objLogFile = fso.CreateTextFile(wshShell.CurrentDirectory & "\" & strLogFileName, True)

i = 0 'счетчик

If objFiles.Count > 0 Then 'если файлы найдены	
	For Each objFile In objFiles
		'пишем имя файла в лог
		objLogFile.WriteLine(objFile.Name)
		i = i + 1
	Next
End If

'закрываем файл лога
objLogFile.Close

'удаляем ссылки
Set objLogFile = Nothing
Set objFiles = Nothing
Set fso = Nothing
Set wshShell = Nothing
Set objWMI = Nothing

'выводим сообщение
If i = 0 Then 
	MsgBox "Файлы с расширением " & strExtension & " не найдены"	
Else
	MsgBox "Найдено " & i & " файла(ов) c расширением " & strExtension
End If

Можно, конечно, не выбирать ни диск, ни каталог, но тогда скрипт будет медленнее работать.
И, разумеется, для запуска нужно обладать правами админа на сервере.
p.s. А если добавить к имени файла лога, например, текущую дату или дату+время и закинуть скрипт в планировщик, то в дальнейшем можно смело курить... ну что Вы там курите

9

Re: WSH: Поиск файлов по маске на сервере

nostro пишет:

А есть где-нибудь документация по использованию логпарсера в VBS?

В той же справке «LogParser.chm», разделе «COM API».

dab00, курить можно, действительно, смело, ибо WMI без LIKE не даёт поиск во вложенных папках, а с LIKE — можно заработать рак лёгких, пока завершится опрос.

10 (изменено: dab00, 2011-10-18 20:32:11)

Re: WSH: Поиск файлов по маске на сервере

alexii пишет:

ибо WMI без LIKE не даёт поиск во вложенных папках, а с LIKE — можно заработать рак лёгких, пока завершится опрос.

Не соглашусь на счет "без LIKE" - в приведенном скрипте убираем Path и получаем информацию обо всех файлах mp3 на диске.
А LIKE, само собой, сильно замедляет скорость выполнения любого запроса.
Тем не менее запросы кэшируются, поэтому во второй и последующие разы выполняются значительно быстрее.

11

Re: WSH: Поиск файлов по маске на сервере

Я Вам про Фому:

alexii пишет:

без LIKE не даёт поиск во вложенных папках

Вы мне про Ерёму:

dab00 пишет:

…"без LIKE" - …убираем Path …обо всех файлах … на диске.

Кэшируются не запросы:

dab00 пишет:

Тем не менее запросы кэшируются, поэтому во второй и последующие разы выполняются значительно быстрее.

Работает обычный дисковый кэш. Соответствующее ускорение получим при использовании любых повторных запросах, лишь бы памяти хватало.

dab00, дело в том, что как-то тут один коллега делал некое исследование на эту тему: что работает быстрее. В лидерах оказались dir и Log Parser.

12

Re: WSH: Поиск файлов по маске на сервере

alexii пишет:

как-то тут один коллега делал некое исследование на эту тему: что работает быстрее. В лидерах оказались dir и Log Parser.

Я  и не сомневаюсь в том, что через WMI медленно, но пост был про скрипт.
Предлагаю сворачивать дискуссию. Как отправить полученный список по почте, полагаю, уважаемый nostro найдет на форуме.

13

Re: WSH: Поиск файлов по маске на сервере

dab00 пишет:

Я  и не сомневаюсь в том, что через WMI медленно, но пост был про скрипт.

Поясните, пожалуйста, Вашу мысль.

14

Re: WSH: Поиск файлов по маске на сервере

Всем огромное спасибо! Пока разбираюсь с логпарсером - уж очень понравилось

15 (изменено: dab00, 2011-10-19 12:00:47)

Re: WSH: Поиск файлов по маске на сервере

alexii пишет:

Поясните, пожалуйста, Вашу мысль.

Поясняю. Читал где-то, да и сам не раз убеждался в том, что работа с файлами через WMI медленнее, чем, например, через fso, а если в запросе присутствует LIKE - как, например, у меня в USBMaster при нажатии на кнопку "Файлы" - проверка наличия файлов INFCACHE.1 и oemX.inf - то, как Вы справедливо заметили, "можно заработать рак лёгких, пока завершится опрос".
Что касается "но пост был про скрипт" - не знаком с утилитой Log Parser - почитал по ссылкам - забираю слова обратно, с Вашего позволения - интересная утилита.

16

Re: WSH: Поиск файлов по маске на сервере

dab00, спасибо, ясно.

17

Re: WSH: Поиск файлов по маске на сервере

Даже хочется сказать больше - возможности Log Parser впечатлили - вкуснейшая вещь!