Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Проверка наличия и запуск нескольких файлов (http://forum.oszone.net/showthread.php?t=325384)

id342181564@vk 31-03-2017 12:44 2724647

Проверка наличия и запуск нескольких файлов
 
Всем доброго дня ! Посоветуйте пожалуйста , как лучше реализовать следующую последовательность действий в VBS :

Допустим, есть исполняемые файлы - 1.exe,2.exe,3.exe

0. проверка наличия 1.exe,2.exe,3.exe в папке со скриптом и в случае отсутсвия одного или нескольких файлов - появление MSGBOX с произвольным текстом и перечисление отсутствующих файлов. В случае появления MSGBOX - пункты 1,2,3 пропускаются - скрипт завершается.
1. проверка наличия запущенного процесса 1.exe и в случае его ..кхм...наличия - завершение процесса и запуск 3.exe.
2. одновременное выполнение 1.exe, а затем 2.exe (без ожидания завершения 1.exe)
3. ожидание завершения 2.exe пользователем, а затем завершение процесса 1.exe и после - выполнение 3.exe

megaloman 31-03-2017 16:46 2724708

id342181564@vk,
Цитата:

1. проверка наличия запущенного процесса 1.exe и в случае его ..кхм...наличия - завершение процесса и запуск 3.exe.
кхм, а дальше что? 2 и 3 делать? или нет? А если в 1 наличствует не только 1.exe но и 2.exe? что делать?

id342181564@vk 31-03-2017 16:48 2724709

а дальше по порядку)
Цитата:

Цитата megaloman
А если в 1 наличствует не только 1.exe но и 2.exe? что делать? »

- игнорировать и продолжать по пунктам.

megaloman 01-04-2017 14:19 2724903

В меру моего понимания Вашей постановки задачи
Код:

exe1 = "notepad.exe"
exe2 = "calc.exe"
exe3 = "ftp.exe"

TimeWait = 3    ' Время опроса наличия exe2

PScript = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
' PScript = "C:\Windows\System32\"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set WMI = GetObject("winMgmts:")
Set WshS = CreateObject("WScript.Shell")

Msg = ""
If Not FSO.FileExists(PScript + exe1) Then Msg = Msg + vbCrLf + exe1
If Not FSO.FileExists(PScript + exe2) Then Msg = Msg + vbCrLf + exe2
If Not FSO.FileExists(PScript + exe3) Then Msg = Msg + vbCrLf + exe3

If Not Len(Msg) = 0 Then
    Msg = "В папке" + vbCrLf + PScript + vbCrLf + "Отсутствует:" + vbCrLf + Msg
    MsgBox Msg
Else
                                    ' Если выполняется exe3, то, если есть, убиваем exe1 и exe2 и ничего не делаем
   
    If ExistProc(exe3, False) Then
        Answer = ExistProc(exe1, True)
        Answer = ExistProc(exe2, True)
        MsgBox "Выполняется " + exe3
        WScript.Quit
    End If
                                    ' Если выполняется exe1, и нет exe2 то завершаем exe1 и запускаем exe3
   
    If ExistProc(exe1, False) And Not ExistProc(exe2, False) Then
        Answer = ExistProc(exe1, True)
        Answer = WshS.Run(PScript + exe3, 1, False)
        WScript.Quit
    End If
                                    ' Если выполняется exe1, и exe2 то ждем завершения exe2
   
    If ExistProc(exe1, False) And ExistProc(exe2, False) Then
        Msg = "Выполняются " + vbCrLf + vbCrLf + exe1 + vbCrLf + exe2 + vbCrLf + vbCrLf + "Ожидание завершения пользователем" + vbCrLf + vbCrLf + exe2
        Answer = WshS.Popup(Msg, 10, "Информация к сведению", 0)
    Else
                                      ' Запускаем exe1 и exe2
        Answer = ExistProc(exe1, True)
        Answer = ExistProc(exe2, True)
        Answer = WshS.Run(PScript + exe1, 1, False)
        Answer = WshS.Run(PScript + exe2, 1, False)
    End If
                                      ' После завершения exe2 убьем exe1 и запустим exe3
    Do
        If ExistProc(exe2, False) Then
            WScript.Sleep(TimeWait*1000)
        Else
            Answer = ExistProc(exe1, True)
            Answer = WshS.Run(PScript + exe3, 1, False)
            Exit Do
        End If
    Loop
End If


Function ExistProc(NProc, Cancel)
    SQuery = "Select * From Win32_Process Where Name=" + """" + NProc + """"
    Set Processes = WMI.ExecQuery(SQuery)
    ExistProc = (Processes.Count <> 0)
    If ExistProc And Cancel Then
        For Each Process In Processes
            Process.Terminate
        Next
        'WScript.Sleep 2000
    End If
End Function


id342181564@vk 03-04-2017 10:01 2725680

спасибо большое) всё работает , осталось только изучить в подробностях и кое что подправить. К примеру : PScript = "C:\Windows\System32\" - эта строка определяет путь к файлам ? Если убрать PScript из строчек вроде : Answer = WshS.Run(PScript + exe1, 1, False) - всё работает на отлично - в противном случае, выдает ошибку об отсутствии файла (хотя msgbox не появляется, если файлы лежат в той же папке - что и скрипт, что в общем то и требовалось).

id342181564@vk 03-04-2017 10:34 2725700

Еще хотел спросить по поводу этого пункта
Код
' Если выполняется exe1, и нет exe2 то завершаем exe1 и запускаем exe3

If ExistProc(exe1, False) And Not ExistProc(exe2, False) Then
Answer = ExistProc(exe1, True)
Answer = WshS.Run(exe3, 1, False)
WScript.Quit
End If


- тут по задумке скрипт должен не завершаться на выполнении exe3 - а начинать выполнение заново , либо с запуска только что завершенного exe1 и затем exe2 , и далее продолжать работу. Как это лучше реализовать?

megaloman 03-04-2017 13:35 2725775

id342181564@vk, строка ' PScript = "C:\Windows\System32\" начинается с апострофа ', она не исполняется, мне она была нужна для отладки для ссылок на существующие файлы. В предыдущей строке определяется путь к скрипту, Вы требовали, чтобы екзешники лежали в той же папке, и в таких условиях это работает. Если все файлы лежат по одному пути, то в закомментированной строке уберите апостроф и пропишите свой путь. Если для каждого экзешника Вы хотите указывать персональный путь, примените PScript = "", а вместо имени файла укажите полный путь имени файла.

id342181564@vk 03-04-2017 16:06 2725845

спасибо большое за столь развернутый ответ и труды) все работает отлично !
Хотел спросить вас еще на тему VBS, то это уже будет немного оффтоп - если конечно вас не затруднит?

megaloman 03-04-2017 21:17 2725936

Цитата:

- тут по задумке скрипт должен не завершаться на выполнении exe3 - а начинать выполнение заново
Вот вариант
Код:

exe1 = "notepad.exe"
exe2 = "calc.exe"
exe3 = "ftp.exe"

TimeWait = 3    ' Время опроса наличия exe2
TimePause = 60  ' Время ожидания перезапуска скрипта

PScript = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
' PScript = "C:\Windows\System32\"

Set FSO = CreateObject("Scripting.FileSystemObject")
Set WMI = GetObject("winMgmts:")
Set WshS = CreateObject("WScript.Shell")

Continue = True

Do While Continue

Msg = ""
If Not FSO.FileExists(PScript + exe1) Then Msg = Msg + vbCrLf + exe1
If Not FSO.FileExists(PScript + exe2) Then Msg = Msg + vbCrLf + exe2
If Not FSO.FileExists(PScript + exe3) Then Msg = Msg + vbCrLf + exe3

If Not Len(Msg) = 0 Then
    Msg = "В папке" + vbCrLf + PScript + vbCrLf + "Отсутствует:" + vbCrLf + Msg
    MsgBox Msg
    WScript.Quit
Else
  Do
                                    ' Если выполняется exe3, то ничего не делаем
    If ExistProc(exe3, False) Then
        Answer = ExistProc(exe1, True)
        Answer = ExistProc(exe2, True)
        Msg = "Выполняется " + exe3 + vbCrLf + "Ждём её завершения?"
        Answer = WshS.Popup(Msg, TimePause, "Как поступаем?", 33)
        Continue = Not (Answer = 2)
        Exit Do
    End If
                                    ' Если выполняется exe1, и нет exe2 то завершаем exe1 и запускаем exe3
   
    If ExistProc(exe1, False) And Not ExistProc(exe2, False) Then
        Answer = ExistProc(exe1, True)
        Answer = WshS.Run(PScript + exe3, 1, True)
        Exit Do
    End If
                                    ' Если выполняется exe1, и exe2 то ждем завершения exe2
   
    If ExistProc(exe1, False) And ExistProc(exe2, False) Then
        Msg = "Выполняются " + vbCrLf + vbCrLf + exe1 + vbCrLf + exe2 + vbCrLf + vbCrLf + "Ожидание завершения пользователем" + vbCrLf + vbCrLf + exe2
        Answer = WshS.Popup(Msg, 10, "Информация к сведению", 0)
    Else
        Answer = ExistProc(exe1, True)
        Answer = ExistProc(exe2, True)
        Answer = WshS.Run(PScript + exe1, 1, False)
        Answer = WshS.Run(PScript + exe2, 1, False)
    End If
    Do
        If ExistProc(exe2, False) Then
            WScript.Sleep (TimeWait * 1000)
        Else
            Answer = ExistProc(exe1, True)
            Answer = WshS.Run(PScript + exe3, 1, True)
            Exit Do
        End If
    Loop
    Exit Do
  Loop
End If
  If Continue Then
      Msg = "Завершилась " + exe3 + vbCrLf + "Продолжим работу скрипта?"
      Answer = WshS.Popup(Msg, TimePause, "Как поступаем?", 33)
      Continue = Not (Answer = 2)
  End If
Loop


Function ExistProc(NProc, Cancel)
    SQuery = "Select * From Win32_Process Where Name=" + """" + NProc + """"
    Set Processes = WMI.ExecQuery(SQuery)
    ExistProc = (Processes.Count <> 0)
    If ExistProc And Cancel Then
        For Each Process In Processes
            Process.Terminate
        Next
        'WScript.Sleep 2000
    End If
End Function

После отработки exe3 скрипт выдаст запрос, что делать дальше. Это сделано для того, чтобы легально можно было завершить скрипт. Если в течение некоторого времени не будет нажато ничего или нажат ОК, запуск программ повторится.
Цитата:

Хотел спросить вас еще на тему VBS, то это уже будет немного оффтоп - если конечно вас не затруднит
Формулируйте проблему, надеюсь, найдутся желающие её разрешить. За спрос не бьют в нос.


Время: 16:27.

Время: 16:27.
© OSzone.net 2001-