Что нового

Проверка наличия каталога на компе в сети

Maks

Новичок
Сообщения
26
Репутация
0
Всем привет! Написал скрипт проверки наличия каталога Films$ на компах в сети. Но как-то он медленно работает. Не могу понять в чеи дело. Кто-то может подскажет в чем дело, или другой вариант проверки?
Вот сам скрипт.
 

agikon

Знающий
Сообщения
789
Репутация
17
ну так может дело не в скрипте а в сети. например если включен брандмауэр то даже по шаре долго думает прежде чем зайти.
 
Автор
M

Maks

Новичок
Сообщения
26
Репутация
0
на компе, с которого запускается скрипт брандмауер выключен (да и на машинах в сети думаю тоже).
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Maks
Да, действительно медленно.
Если без GUI, гораздо быстрее.
(Time: 15.767 - на сети из 6 ПК + Касперский)

Код:
#include <Array.au3>
#include <File.au3>

$all_comp = ReturnComp()
;_ArrayDisplay($all_comp)
	
For $k=1 To UBound($all_comp)-1
	$cat_c="\\" & $all_comp[$k] & "\Films$\" 
	If Not FileExists($cat_c) Then
		ConsoleWrite("***ОШИБКА!!! - Не удалось открыть каталог " & $cat_c & @CRLF)
	Else
		ConsoleWrite("каталог " & $cat_c & @CRLF)	
	EndIf
Next

Func ReturnComp()
	
Local $Code = ""
    $Code &= 'Function AllComp()' & @LF
	$Code &= '  Set WinNT = GetObject("WinNT:")' & @LF
    $Code &= '  Set FSO = CreateObject("Scripting.FileSystemObject")' & @LF
    $Code &= '  WinNT.Filter = Array("domain")' & @LF
    $Code &= '  Counter = 0' & @LF
    $Code &= '  StrCompFullName=""' & @LF
    $Code &= '     For Each Domain In WinNT' & @LF
    $Code &= '          Set CurrDomain = GetObject("WinNT://" & Domain.Name)' & @LF
    $Code &= '          CurrDomain.Filter = Array("computer")' & @LF
    $Code &= '          For Each Comp In CurrDomain' & @LF
    $Code &= '             Counter = Counter + 1' & @LF
	$Code &= '             If Counter=1 Then' & @LF
	$Code &= '                StrCompFullName= Comp.Name' & @LF
	$Code &= '             Else' & @LF
	$Code &= '                StrCompFullName= StrCompFullName & "," & Comp.Name' & @LF
    $Code &= '             End If' & @LF
	$Code &= '           Next' & @LF
	$Code &= '      Next' & @LF
    $Code &= '  AllComp=StrCompFullName' & @LF	
	$Code &= 'End Function'

    Local $VbsObj = ObjCreate("ScriptControl")
    If @error Then Return SetError(1, 0, -1)

    $VbsObj.Language = "vbscript"
    $VbsObj.AddCode($Code)
 
    $strComp = $VbsObj.Run("AllComp")
 	$arrComp=StringSplit(StringReplace($strComp, ",", @LF), @LF)
;~     _ArrayDisplay($arrComp)
    Return $arrComp
EndFunc
 
Автор
M

Maks

Новичок
Сообщения
26
Репутация
0
мне без GUI не как нельзя. У меня в сети компов 47 и на всех NOD. Времени пошло Time: 351.658
+ сообщение "***ОШИБКА!!! - Не удалось открыть каталог.... " вывожу в Edit на форме.
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Я не правильно выразился, с GUI можно.
Просто у Вас в реализации GUI было что-то.
Я не стал разбираться.
Вот пример с GUI

Код:
#include <Array.au3>
#include <File.au3>

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=c:\documents and settings\user_01\?aai?ee noie\form1.kxf
$Form1 = GUICreate("Form1", 524, 228, 192, 114)
$Edit1 = GUICtrlCreateEdit("", 8, 8, 505, 169)
GUICtrlSetData(-1, "Edit1")
$Button1 = GUICtrlCreateButton("Старт", 8, 192, 113, 25)
$Button2 = GUICtrlCreateButton("Выход", 400, 192, 113, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Edit1
			
		Case $Button1			
			$all_comp = ReturnComp()
			;_ArrayDisplay($all_comp)	
			For $k=1 To UBound($all_comp)-1
				$cat_c="\\" & $all_comp[$k] & "\C$\Program Files\"
				If Not FileExists($cat_c) Then
					;ConsoleWrite("***ОШИБКА!!! - Не удалось открыть каталог " & $cat_c & @CRLF)
					GUICtrlSetData ($Edit1, "***ОШИБКА!!! - Не удалось открыть каталог " & $cat_c & @CRLF, "Input")
				Else
					;ConsoleWrite("каталог " & $cat_c & @CRLF)
					GUICtrlSetData ($Edit1, "Каталог " & $cat_c & @CRLF, "Input")
				EndIf
			Next
		Case $Button2
			Exit
	EndSwitch
WEnd

Func ReturnComp()
Local $Code = ""
    $Code &= 'Function AllComp()' & @LF
	$Code &= '  Set WinNT = GetObject("WinNT:")' & @LF
    $Code &= '  Set FSO = CreateObject("Scripting.FileSystemObject")' & @LF
    $Code &= '  WinNT.Filter = Array("domain")' & @LF
    $Code &= '  Counter = 0' & @LF
    $Code &= '  StrCompFullName=""' & @LF
    $Code &= '     For Each Domain In WinNT' & @LF
    $Code &= '          Set CurrDomain = GetObject("WinNT://" & Domain.Name)' & @LF
    $Code &= '          CurrDomain.Filter = Array("computer")' & @LF
    $Code &= '          For Each Comp In CurrDomain' & @LF
    $Code &= '             Counter = Counter + 1' & @LF
	$Code &= '             If Counter=1 Then' & @LF
	$Code &= '                StrCompFullName= Comp.Name' & @LF
	$Code &= '             Else' & @LF
	$Code &= '                StrCompFullName= StrCompFullName & "," & Comp.Name' & @LF
    $Code &= '             End If' & @LF
	$Code &= '           Next' & @LF
	$Code &= '      Next' & @LF
    $Code &= '  AllComp=StrCompFullName' & @LF	
	$Code &= 'End Function'

    Local $VbsObj = ObjCreate("ScriptControl")
    If @error Then Return SetError(1, 0, -1)

    $VbsObj.Language = "vbscript"
    $VbsObj.AddCode($Code)
 
    $strComp = $VbsObj.Run("AllComp")
 	$arrComp=StringSplit(StringReplace($strComp, ",", @LF), @LF)
    ; _ArrayDisplay($arrComp)
    Return $arrComp
EndFunc
 
Верх