Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Сетеывая папка работа с фильтрами по расширению с использованием WMI (http://forum.oszone.net/showthread.php?t=294485)

andr_mozg 26-01-2015 12:48 2461498

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

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

Мой скрипт

Скрытый текст
PHP код:

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

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

NetworkObject.MapNetworkDrive ""ServerShareFalse

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 ServerShareTrueFalse 





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



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

Скрытый текст


PHP код:

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 ""ServerShareFalse

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 ServerShareTrueFalse 




но если он (ну не этот а с использованием WMI )
PHP код:

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 2461504

Цитата:

Цитата andr_mozg
то как его натравить на шару я не вкурю. »

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

andr_mozg 26-01-2015 13:44 2461532

А вот об этом я догадывался что печально.
Как диск прикрутить шару не могу, скриптов может одновременно работать много причем пути все разные, букв на всех не хватит.

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

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

Спасибо

Iska 26-01-2015 14:09 2461557

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 2461569

Дело в том что мне надо посмотреть не просто наличие, а еще и свойство этих файлов, в часности определить есть ли файлы дата создание которых больше чем XX минут.

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

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

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

Спасибо

Iska 26-01-2015 14:32 2461584

Цитата:

Цитата andr_mozg
дата создание которых больше чем 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


Время: 08:12.

Время: 08:12.
© OSzone.net 2001-