2013-12-17 6 views
1

У меня есть следующая функция, предназначенная для рекурсивного чтения всех пространств имен WMI на машине в зависимости от переданного пространства имен (по умолчанию скрипт вызывает ReadWMI («root»). Если пространство имен WMI содержит имя sms или ccm, я хочу протестировать запись в это пространство имен, чтобы проверить работу написания. Если Writing to WMI не работает в этой функции, я хочу выйти из цикла For Loop и полностью выйти из функции.Как выйти из каждой петли внутри функции?

Что я замечаю, так это то, что когда Я выхожу из функции выхода или выхода из нее (используя функцию «Выход» или «Выход»). Я возвращаюсь к следующему, а не полностью выхожу из функции. Это вызывает ряд проблем, в которые могут быть записаны другие пространства имен.

Function ReadWMI(strNameSpace) 

Dim oWMI, colNameSpaces, objNameSpace, sFullNamespace 

'ReadWMI = "True" 

WMI_ReadRepository = "Healthy" 

On Error Resume Next 

'Verify all namespaces 

Set oWMI = GetObject("winmgmts:\\" & sComputer & "\" & strNameSpace) 

If Err.Number <> 0 Then 

    ReadWMI = "False" 

    WMI_ReadRepository = "Unhealthy" 

    oLog.WriteLine Now()& " - " & "ReadWMI(): Failed to bind to WMI namespace " & strNamespace & ". Stopping WMI Verification" 
    oLog.WriteLine Now()& " - " & "ReadWMI(): Error Code: " & Err.Number 
    'oLog.WriteLine Now()& " - " & "ReadWMI(): Error Description: " & Err.Description 
    Err.Clear 

    Exit Function 

Else 

    oLog.WriteLine Now()& " - " & "ReadWMI(): Successfully connected to WMI namespace " & strNamespace 

End If 

Set colNameSpaces = oWMI.InstancesOf("__NAMESPACE") 

For Each objNameSpace In colNameSpaces 

    sFullNamespace = LCase(strNamespace & "\" & objNamespace.Name) 



    If InStr(sFullNamespace,"ccm") Or InStr(sFullNamespace,"sms") > 0 Then 

     oLog.WriteLine Now()& " - " & "ReadWMI(): Writing to " & sFullNamespace & " WMI Namespace if WMIWriteRepository set to TRUE" 

     If WMIWriteRepository = True Then 

      If WriteWMI(sFullNamespace) = "False" Then 

       oLog.WriteLine Now()& " - " & "ReadWMI(): Failed to write to namespace " & sFullNamespace 

       WMI_ReadRepository = "Unhealthy" 

       'ReadWMI = "False" 

       Exit Function 

      End If 

     Else 

      oLog.WriteLine Now()& " - " & "ReadWMI(): WMIWriteRepository set to False or OS is a Server. Will not write to repository."  

     End If 


    End If 


    'Call VerifyWMI again to run through the next namespace  

    Call ReadWMI(sFullNamespace) 

Next 



'ReadWMI = "True" 

'WMI_ReadRepository = "Healthy" 

Set oWMI = Nothing 

On Error Goto 0 

End Function 
+0

Возможно, вы, вероятно, выходите на более ранний рекурсивный вызов. –

+0

Вы правы, теперь, когда я смотрю на него, vbsedit показывает 2 рекурсивных вызова, один для root \ ccm и один для root \ ccm \ locationservices. Не совсем уверен, как с этим справиться. – infrb

ответ

2

Если что-то пошло не так, и вы хотите выпрыгнуть из вызова рекурсивной функции, введите возвращаемое значение False (раскомментируйте 'ReadWMI = "False" в своем скрипте).

Ваше последнее заявление до следующего должны проверять, если чтение WMI было правильным, так что вместо

Call ReadWMI(sFullNamespace) 

использование

If ReadWMI(sFullNamespace) = "False" Then 
    Exit For 
End If 

Protip: Прекратить использование «строки булевы», они медленно и ошибки заманивают за угол, чтобы укусить вас сзади ("True" <> "true" <> "Treu" <> "True "). Просто используйте True и False. Всякий раз, когда вы хотите вывести логическое значение в строку, оно автоматически преобразуется в правильное строковое значение:

MsgBox True & "/" & False 
' Output: "True/False" 
+0

Хорошие моменты, и спасибо за Protip (я унаследовал сценарий от кого-то другого, поэтому я переживаю и вношу такие изменения). – infrb

Смежные вопросы