【问题标题】:Vbscript to find critical processvbscript查找关键进程
【发布时间】:2016-04-16 01:55:54
【问题描述】:

我编写了一个 vbscript 来从服务器中查找关键进程的详细信息。如果该进程存在,我的进程名称很少,那么脚本应该给出提到的输出。但是这里的问题是即使进程存在或不存在脚本给出与 "CriticalProcesses=NA" 相同的输出。任何人都可以帮助解决这个问题吗?非常感谢任何帮助

   strComputer = "."
   Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
   Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", _
                                          wbemFlagReturnImmediately + wbemFlagForwardOnly)

   For Each objItem In colItems
   'WScript.Echo "Caption: " & objItem.Caption

      Dim process

      Process = objItem.Caption

   Next

   If inStr(process, "SQLserver") Or inStr(process, "mysql") then

      wscript.echo "CriticalProcesses=Database"

   else if inStr(process, "java") Or inStr(process, "weblogic") Then

      wscript.echo "CriticalProcesses=wls"

   else

      wscript.echo "CriticalProcesses=NA"

   End if        
End if 

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    这里的问题是您在 for 循环中迭代您的进程,然后在循环之外测试进程名称。因此,您的 If instr(process.. 位仅检查从您的 for 循环中找到的 last 进程。

    要解决此问题,请将 if 测试粘贴到您的循环中,以便它可以测试找到的每个进程。

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", _
        wbemFlagReturnImmediately + wbemFlagForwardOnly)
    
    For Each objItem In colItems
        'WScript.Echo "Caption: " & objItem.Caption
        Dim process
        Process = objItem.Caption
    
        If inStr(process, "SQLserver") Or inStr(process, "mysql") Then
            wscript.echo "CriticalProcesses=Database"
        ElseIF inStr(process, "java") Or inStr(process, "weblogic") Then
            wscript.echo "CriticalProcesses=wls"
        Else
            'wscript.echo "CriticalProcesses=NA"
        End If
    Next
    

    我还将您的Else If 更改为ElseIf 并删除了不必要的第二个End If

    最后,我在您的Else 中注释掉了那个回显,因为您可能不希望脚本一遍又一遍地指向Echo NA。至少...我不会按 Enter 键 200 次。


    要捕获wlsdatabase 类型的进程是否正在运行,然后在最后只回显一次,您可以在布尔变量中捕获每种类型的真/假,然后在之后进行测试 em> for 循环:

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", _
        wbemFlagReturnImmediately + wbemFlagForwardOnly)
    
    Dim hasDBProcess
    Dim hasWLSProcess
    
    hasDBProcess = False
    hasWLSProcess = False
    
    For Each objItem In colItems
        'WScript.Echo "Caption: " & objItem.Caption
        Dim process
        Process = objItem.Caption
    
        If inStr(process, "SQLserver") Or inStr(process, "mysql") Then
            hasDBProcess = True
        ElseIF inStr(process, "java") Or inStr(process, "weblogic") Then
            hasWLSProcess = True
        End If
    Next
    
    If hasDBProcess Then 
        wscript.echo "CriticalProcess=Database"
    ElseIf hasWLSProcess Then
        wscript.echo "CriticalProcess=wls"
    Else
        wscript.echo "CriticalProcess=NA"
    End if
    

    【讨论】:

    • 非常感谢。现在脚本开始工作了。但是如果多个 java.exe 出现,if 条件在循环内,它会给出多个结果,如果没有提到的进程可用,我什至需要打印 NA
    • 所以不要在for循环中回显,也许只是使用布尔值来捕获您是否找到了wls或数据库类型的进程,然后在循环之外测试布尔值并回显。我会在我的回答中举一个例子。
    • For Each objItem In colItems Dim process : Process = objItem.Caption If inStr(process, "SQLserver") or inStr(process, "mysql") then Processes=Database ElseIf inStr(process, "java ") 或 inStr(process, "weblogic") Then Processes=wls else Processes=NA End if Next If Processes=Database Then wscript.echo "tr_CriticalProcesses=Database" ElseIf Processes=wls Then wscript.echo "tr_CriticalProcesses=wls" else wscript .echo "tr_CriticalProcesses=NA" 结束如果
    • 这行不通,因为您正在遍历每个流程。同样,这只会告诉您For 循环中的最后一个进程是什么。您需要设置单独的变量来跟踪您感兴趣的流程类型,然后在 for 循环之后测试这些变量以找到您想要的。有关执行此操作的方法,请参阅更新的答案。如果您想花哨并且只有一个变量,则可以使用数组或集合对象。但对于初学者来说,我会坚持使用布尔值。
    • 我刚刚注意到我在hasWLSProcess = True 上方for 循环上方编写的第二段代码中有一个错误。我只是将其更改为hasWLSProcess = False。本质上,我们希望这些布尔变量在 for 循环之前为 false。然后,如果找到任何东西,我们在循环内将它们设置为 true。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多