PDA

Показать полную графическую версию : [решено] Сетеывая папка работа с фильтрами по расширению с использованием WMI


andr_mozg
26-01-2015, 12:48
Добрый день.

Скрипт я написал, корявый но работает, но очень медленный, решил использовать WMI но возникла проблема.

Мой скрипт


ServerShare = "\\localhost\C$\windows\Temp"
'UserName = "domain\username"
'Password = "password"

Set NetworkObject = CreateObject("WScript.Network")
Set FSO = CreateObject("Scripting.FileSystemObject")

NetworkObject.MapNetworkDrive "", ServerShare, False

Set Directory = FSO.GetFolder(ServerShare)
For Each File In Directory.Files

If UCase(FSO.GetExtensionName(File.Name)) = "ZIP" or UCase(FSO.GetExtensionName(File.Name)) = "XML" Then
WScript.Echo File.Name
end if

Next

NetworkObject.RemoveNetworkDrive ServerShare, True, False





Все работает, но если я указываю реальную шару с большим кол-во файлов (естественно все пермишены в порядки)
ну к примеру 14000 файлов а удв. маске скажим два, то скрипт работает до 5 минут, что не комильфо.



я пишу чуть другой скрипт





On Error Resume Next

ServerShare = "\\localhost\C$\Users\root\AppData\Local\Temp"
'UserName = "domain\username"
'Password = "password"


Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")

Set NetworkObject = CreateObject("WScript.Network")
Set FSO = CreateObject("Scripting.FileSystemObject")

NetworkObject.MapNetworkDrive "", ServerShare, False

If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If

Set colFiles = objService.ExecQuery("SELECT Name FROM CIM_DataFile WHERE Drive = '\\\\localhost\\C$' AND Path = '\\Users\\root\\AppData\\Local\\Temp\\' AND (Extension = 'xml' OR Extension = 'zip')")



For Each objFile In colFiles
WScript.Echo objFile.Name
Next


WScript.Echo "Всего файлов: " & colFiles.Count



NetworkObject.RemoveNetworkDrive ServerShare, True, False



но если он (ну не этот а с использованием WMI )
objService.ExecQuery("SELECT Name FROM CIM_DataFile WHERE Drive='C:' AND Path = '\\Users\\root\\AppData\\Local\\Temp\\' AND (Extension = 'xml' OR Extension = 'zip')")


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

Шара не должна монтироваться как диск! ищу способ обращение как к сетевой шаребез диска типа \\Server_name\Shara_dir

Поможите люди добрые.

Спасибо

Iska
26-01-2015, 12:57
то как его натравить на шару я не вкурю. »
Никак не натравите: в пространстве имён нет и не может быть сетевых ресурсов. Присоединяйте разделённый ресурс в виде диска, работайте с ним, затем отсоединяйте (а вот для «Scripting.FileSystemObject» это как раз необязательно). Но сильно сомневаюсь, что Wbem будет шустрее.

andr_mozg
26-01-2015, 13:44
А вот об этом я догадывался что печально.
Как диск прикрутить шару не могу, скриптов может одновременно работать много причем пути все разные, букв на всех не хватит.

Первый скрипт я кое как собрал и не думаю что он нормальный, может есть другое решение дабы победить проблему по скорости?

Как и говарил основная проблема в том что файлов очень много а нужных может быть 0.. Как можно получить список только нужных причем быстрее чем в моем первом примере?

Спасибо

Iska
26-01-2015, 14:09
andr_mozg, на 14 тысячах сетевых файлов «ляжет» любой скрипт. Тут дело не в скрипте, а в доступе по сети и количестве объектов.

Самый шустрый вариант — LogParser. Например:
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Path USING TO_LOWERCASE(EXTRACT_EXTENSION(Name)) AS Ext FROM '\\localhost\C$\windows\Temp\*.*' WHERE Ext = 'zip' OR Ext = 'xml'" -i:FS -q:ON
Но я бы не рассчитывал на какое-либо заметное ускорение.

andr_mozg
26-01-2015, 14:17
Дело в том что мне надо посмотреть не просто наличие, а еще и свойство этих файлов, в часности определить есть ли файлы дата создание которых больше чем XX минут.

Я проверил через монтирования сетевой шары как диска на своей машине, по моим накаленным тестам первый вариан отстал от второго в 8 раз. что есть очень много.

Сеть работает отлично, но вот скорость первого варианта из-за тупого перебора очень страдает.

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

Спасибо

Iska
26-01-2015, 14:32
дата создание которых больше чем XX минут. »
"%ProgramFiles%\Log Parser 2.2\LogParser.exe" "SELECT Path USING TO_LOWERCASE(EXTRACT_EXTENSION(Name)) AS Ext FROM '\\localhost\C$\windows\Temp\*.*' WHERE (Ext = 'zip' OR Ext = 'xml') AND CreationTime <= TO_LOCALTIME(SUB(SYSTEM_TIMESTAMP(), TIMESTAMP('20', 'mm')))" -i:FS -q:ON




© OSzone.net 2001-2012