2015-05-13 2 views
3

У меня есть программа, которая читает имена хостов из txt-файла, сканирует сеть для имени хоста, а затем отображает имя хоста и соответствующую операционную систему Windows (CAPTION).Variable in For Loop Retains Old Value

Я пытаюсь обновить все компьютеры под управлением Windows XP до Windows 7. Я пытаюсь запустить этот список, чтобы дать мне представление о том, сколько машин, которые я обновил, и о том, сколько мне еще нужно обновить, и т. д.

Проблема заключается в том, что когда я использую оператор On Error Resume Next, если скрипт пытается связаться с именем хоста, которое является BAD HOST или если имя хоста DOWN, оно отображает операционную систему с последнего имени хоста. Затем каждое имя, которое выполняет сканирование, перемещается вперед, показывает эту же операционную систему.

Что может быть причиной этой ошибки?

On Error Resume Next 

const ForReading = 1 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objTextFile= objFSO.OpenTextFile _ 
    ("C:\users\bh\desktop\hostnames.txt", ForReading) 

strText = objTextFile.ReadAll 
objTextFile.close 

arrComputers = Split(strText, vbCrlf) 

for Each strComputer in arrComputers 
    Set objWMIService = GetObject("winmgmts:" _ 
     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 

    Set colSettings = objWMIService.ExecQuery _ 
     ("Select * from Win32_OperatingSystem") 

    For Each objOperatingSystem in colSettings 
     Wscript.Echo strComputer & ": " & objOperatingSystem.Caption 
    Next 
Next 

ответ

1

Использование Global On Error Resume Next просто просят Desaster - все ошибки будут игнорироваться, задание не будет сделано, как вы ожидаете, и stale data будет использоваться.

Это:

Dim aErr 

arrComputers = Split(". winxpsp3 nix") 

for Each strComputer in arrComputers 
    On Error Resume Next 
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
    aErr = Array(Err.Number, Err.Description) 
    On Error Goto 0 
    If 0 = aErr(0) Then 
     Set colSettings = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") 
     For Each objOperatingSystem in colSettings 
      Wscript.Echo strComputer & ": " & objOperatingSystem.Caption 
     Next 
    Else 
    WScript.Echo "can't reach", strComputer, "error:", Join(aErr) 
    End If 
Next 

выход:

cscript 30223065.vbs 
.: Microsoft Windows XP Professional 
winxpsp3: Microsoft Windows XP Professional 
can't reach nix error: 462 The remote server machine does not exist or is unavailable 

демонстрирует строго локальную обработку ошибок (макс один рискованная операция между ОЭРНОМ и OEG0) для первой рискованной задачи. Вам придется защищать/оберегать других соответственно или проверять возвращаемые значения.

(см. this для стратегии обработки глобальных ошибок)