2015-12-28 2 views
1

Я запускаю VBScript, чтобы показать настройки DNS и WINS на сотнях хостов Windows 2000 или Windows 2003. Когда сценарий закончен, я хочу знать с первого взгляда, если какие-либо серверы не могут запустить сценарий/не могут подключиться. (Я ищу что-то похожее на PowerShell catch блока, если это возможно)Показать неудачные серверы на выходе

Скрипт ниже

Const FILEPATH = "C:\users\" 
'Get the input file 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set fsoFile = FSO.GetFile(FILEPATH & "servers.txt") 
strFilePath = fsoFile.Path 
Set fsoInput = FSO.OpenTextFile(strFilePath, 1) 

Do While Not fsoInput.AtEndOfStream 
    ComputerName = fsoInput.ReadLine 
    Call showdnswins(ComputerName) 
Loop 

Sub showdnswins(ComputerName) 
    On Error Resume Next 
    Set objWMIService = GetObject("winmgmts:\\" & ComputerName & "\root\cimv2") 
    Set config = objWMIService.ExecQuery _ 
     ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True") 
    For Each conf In config 
     WScript.Echo vbNewLine, "Host name is " & conf.dnshostname 
     WScript.Echo "WINS Primary is " & conf.winsprimaryserver 
     WScript.Echo "WINS Secondary is " & conf.winssecondaryserver 
     For Each strDNSServer In conf.DNSServerSearchOrder 
      WScript.Echo "DNS order is " & strDNSServer 
     Next 
    Next 
End Sub 

На данный момент какие-либо сбои НЕЗАРЕГИСТРИРОВАННЫЙ, а также выявление их из сотен серверов отнимает много времени.

ответ

1

В VBScript ничего подобного catch. Вы должны сами выполнить обработку ошибок.

On Error Resume Next 'enable error handling 
some statement 
If Err Then 
    'error handling and/or reporting goes here 
    Err.Clear 
End If 
other statement 
If Err Then 
    'error handling and/or reporting goes here 
    Err.Clear 
End If 
... 
On Error Goto 0  'disable error handling 

В вашем конкретном случае, вы, вероятно, хотите, чтобы проверить, если соединение WMI выдал ошибку и вернуть статус:

Function showdnswins(ComputerName) 
    On Error Resume Next 
    Set objWMIService = GetObject("winmgmts:\\" & ComputerName & "\root\cimv2") 
    If Err Then 
    showdnswins = False 
    Exit Function 
    End If 
    ... 
    showdnswins = True 
End Function 

, так что вы можете обрабатывать информацию в Do цикле:

Do Until fsoInput.AtEndOfStream 
    ComputerName = fsoInput.ReadLine 
    If Not showdnswins(ComputerName) Then 
    WScript.Echo ComputerName & " is not available." 
    End If 
Loop 

Если вам нужна более подробная информация об ошибке, вы можете вернуть функцию числовому коду состояния или объекту с подробной информацией об ошибке вместо булево значение. Или вы можете добавить некоторые ошибки в самой функции.

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

Другой вариант, так как вы, вероятно, работает скрипт с cscript.exe, чтобы записать информацию об ошибке в StdErr и успеха информации для StdOut:

WScript.StdErr.WriteLine "some error message" 
WScript StdOut.WriteLine "regular information 

Затем вы можете перенаправить вывод на консоли, используя операторы перенаправления > (для StdOut) и 2> (для StdErr):

cscript your.vbs >out.txt 2>error.log 
Смежные вопросы