Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays VBScript以特定的顺序启动程序,并附带规定_Arrays_Vbscript_Wmi_Dynamic Arrays_Launch - Fatal编程技术网

Arrays VBScript以特定的顺序启动程序,并附带规定

Arrays VBScript以特定的顺序启动程序,并附带规定,arrays,vbscript,wmi,dynamic-arrays,launch,Arrays,Vbscript,Wmi,Dynamic Arrays,Launch,我认为我最初的问题太宽泛了。在上周思考了如何实现我的目标之后,我相信我需要实现一个多维动态数组,并使用redim preserve来保存数据。 我的第一个数组是“strProgramList”,它是包含程序名的完整路径。我分割每个路径并获取其上限以获得程序名。现在我需要将它组合成一个具有两列的多维数组,一列包含完整路径,另一列包含程序名。我知道您只能在更改最后一个维度时保留,但我不知道如何绕过此限制。我尝试了很多方法,但我被难倒了。我更新了代码,但它不起作用。我想我需要一个嵌套的for-else

我认为我最初的问题太宽泛了。在上周思考了如何实现我的目标之后,我相信我需要实现一个多维动态数组,并使用redim preserve来保存数据。 我的第一个数组是“strProgramList”,它是包含程序名的完整路径。我分割每个路径并获取其上限以获得程序名。现在我需要将它组合成一个具有两列的多维数组,一列包含完整路径,另一列包含程序名。我知道您只能在更改最后一个维度时保留,但我不知道如何绕过此限制。我尝试了很多方法,但我被难倒了。我更新了代码,但它不起作用。我想我需要一个嵌套的for-else循环,我已经尝试过了,但是没有成功

'Option Explicit
' ---------------------------------------------------------------------------------
'---Declare Globals Variables
Dim objProcess, objWMIService, colProcesses, Process, strComputer

'---Declare Program Variables
Dim strProgram1, strProgram2, strProgram3, strProgramList, strProgramPath, strPathComponents, strProgramName

ReDim strProgramNameList(1, -1)


Dim  strProgram, pid, objShell, strCommand, i, program1StartTime, boolNeedsRestart, currentProgramStartTime, removalIndex, x, objFso, strProgramRestartList
Set objFso = CreateObject("Scripting.FileSystemObject")

'---Create Program Variables
strProgram1 = "%SystemRoot%\notepad.exe"
strProgram2 = "C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE"
strProgram3 = "C:\Program Files\Microsoft Office\root\Office16\ONENOTE.EXE"

'---Add Program Path Variables to an Array
strProgramList = Array(strProgram1,strProgram2,strProgram3)
'strProgramNameList = Array()
strProgramRestartList = Array()
boolNeedsRestart = false

'---Iterating using For each loop to get program name. 
For Each strProgramPath In strProgramList
        strPathComponents = Split(strProgramPath, "\")
        strProgramName = strPathComponents(Ubound(strPathComponents))
        ReDim Preserve strProgramNameList(1, UBound(strProgramNameList) + 1)
        ReDim Preserve strProgramNameList(2, UBound(strProgramNameList) + 1)
        strProgramNameList(1, UBound(strProgramNameList)) = strProgramName
        strProgramNameList(2, UBound(strProgramNameList)) = strProgramPath           
Next
msgbox Ubound(strProgramNameList,5)






'---Program launching logic. 
For i = 1 To uBound(strProgramNameList)
    If isrunning(strProgramNameList(i)) Then

        If isrunning(strProgramNameList(0)) then
           program1StartTime = getProcessStartTime(strProgramNameList(0))
           currentProgramStartTime = getProcessStartTime(strProgramNameList(i))
                If WMIDateStringToDate(program1StartTime) > WMIDateStringToDate(currentProgramStartTime) Then
                    boolNeedsRestart = true
                    ReDim Preserve strProgramRestartList(UBound(strProgramRestartList) + 1)
                    strProgramRestartList(UBound(strProgramRestartList)) = strProgramNameList(i)  
                Else
                    boolNeedsRestart = false
                End If
        Else
            boolNeedsRestart = true

            ReDim Preserve strProgramRestartList(UBound(strProgramRestartList) + 1)
            strProgramRestartList(UBound(strProgramRestartList)) = strProgramNameList(i)
        End if
    Else
        If objFso.FileExists(strProgramList(i)) Then
            boolNeedsRestart = true

            ReDim Preserve strProgramRestartList(UBound(strProgramRestartList) + 1)
            strProgramRestartList(UBound(strProgramRestartList)) = strProgramNameList(i)    
        'Else
        'MsgBox(strProgramList(i)) 
        End If
    End If                                                            
Next

If boolNeedsRestart = true Then 

    killprocess(strProgramNameList(0))

    For i = 0 To uBound(strProgramRestartList)
                                killprocess(strProgramRestartList(i))
               Next

    restartprocess strProgramNameList(0)
    For i = 0 To uBound(strProgramRestartList) 
                              restartprocess strProgramRestartList(i)
    Next
End If

Sub RestartProcess(strProgramPath)
    Set objShell = WScript.CreateObject("WScript.Shell")
        strCommand = chr(34)& strProgramPath &chr(34)
        objShell.Run strCommand,1,False 
        pid = WaitForProcess(strProgramPath, 5)

If pid > 0 Then
    objShell.AppActivate pid
End If
Set objShell = Nothing
End Sub 

' ---------------------------------------------------------------------------------
Function KillProcess(strProcessKill)
              Dim aProcessRunning
               aProcessRunning = false
                              strComputer = "."
               Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer& "\root\cimv2") 
               Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='" & strProcessKill & "'")
               For Each objProcess in colProcesses
        If  LCase( strProcessKill )= LCase( objProcess.Name ) Then
                              objProcess.Terminate()
                              aProcessRunning = True
               End If    
               Next
               If aProcessRunning Then
                              ' Wait and make sure the process is terminated.
        Do Until Not aProcessRunning
            Set colProcesses = GetObject( _
                               "winmgmts:{impersonationLevel=impersonate}" _
                               ).ExecQuery( "Select * From Win32_Process Where Name = '" _
                             & strProcessKill & "'" )
            WScript.Sleep 100 'Wait for 100 MilliSeconds
            If colProcesses.Count = 0 Then 'If no more processes are running, exit loop
                aProcessRunning = False
            End If
        Loop
    End If
               Set colProcesses = Nothing
               Set objWMIService = Nothing
               KillProcess = aProcessRunning
End Function

' ---------------------------------------------------------------------------------
Function IsRunning(strProgram)
               Dim bProcessRunning
               bProcessRunning = false
               strComputer = "."
               Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer& "\root\cimv2")
               Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='" & strProgram & "'")
               For Each objProcess in colProcesses
                              If objProcess.Name = strProgram Then
                                             bProcessRunning = True
                              End If
               Next
               Set colProcesses = Nothing
               Set objWMIService = Nothing
               IsRunning = bProcessRunning
End Function

' ---------------------------------------------------------------------------------
Function WaitForProcess(imageName, tries)
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer& "\root\cimv2")
    Set colProcesses = objWMIService.ExecQuery("SELECT ProcessId FROM Win32_Process WHERE Name='" & imageName & "'")
    WaitForProcess = 0
    While tries > 0 And WaitForProcess = 0
        For Each process In colProcesses
            WaitForProcess = process.ProcessId
        Next
        If WaitForProcess = 0 Then
            WScript.Sleep 1000
            tries = tries - 1
        End If
        'MsgBox(imageName)
    Wend   
               Set colProcesses = Nothing
               Set objWMIService = Nothing                     
End Function

' ---------------------------------------------------------------------------------

Function getProcessStartTime(programName)
               strComputer = "."
               Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer& "\root\cimv2")
               Set colProcesses = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name='" & programName & "'")
               For Each objProcess in colProcesses
                      getProcessStartTime = objProcess.CreationDate   
               Next
               Set colProcesses = Nothing
               Set objWMIService = Nothing
End Function

' ---------------------------------------------------------------------------------
Function WMIDateStringToDate(dtmStart)
    WMIDateStringToDate = CDate(Mid(dtmStart, 5, 2) & "/" & _
        Mid(dtmStart, 7, 2) & "/" & Left(dtmStart, 4) _
            & " " & Mid (dtmStart, 9, 2) & ":" & _
                Mid(dtmStart, 11, 2) & ":" & Mid(dtmStart, _
                    13, 2))
End Function 

脚本如何查找程序2和3并在找到时关闭它们。然后它寻找程序1。如果找到程序1,则继续,否则启动它。然后启动程序2和3。感谢您的帮助。这实际上取决于打开应用程序的顺序。如果程序2和3打开,但仅在程序1之后,这是正常的。我不希望程序被关闭在中间的人的工作日,如果他们打开了正确的顺序。我改进了我的问题,希望能得到更多的建议。ThanksHow关于脚本查找程序2和3,如果找到,则关闭它们。然后它寻找程序1。如果找到程序1,则继续,否则启动它。然后启动程序2和3。感谢您的帮助。这实际上取决于打开应用程序的顺序。如果程序2和3打开,但仅在程序1之后,这是正常的。我不希望程序被关闭在中间的人的工作日,如果他们打开了正确的顺序。我改进了我的问题,希望能得到更多的建议。谢谢