У меня есть следующая функция, предназначенная для рекурсивного чтения всех пространств имен 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
Возможно, вы, вероятно, выходите на более ранний рекурсивный вызов. –
Вы правы, теперь, когда я смотрю на него, vbsedit показывает 2 рекурсивных вызова, один для root \ ccm и один для root \ ccm \ locationservices. Не совсем уверен, как с этим справиться. – infrb