PDA

Показать полную графическую версию : [решено] Проверка наличия и запуск нескольких файлов


id342181564@vk
31-03-2017, 12:44
Всем доброго дня ! Посоветуйте пожалуйста , как лучше реализовать следующую последовательность действий в 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
id342181564@vk, 1. проверка наличия запущенного процесса 1.exe и в случае его ..кхм...наличия - завершение процесса и запуск 3.exe.кхм, а дальше что? 2 и 3 делать? или нет? А если в 1 наличствует не только 1.exe но и 2.exe? что делать?

id342181564@vk
31-03-2017, 16:48
а дальше по порядку) А если в 1 наличствует не только 1.exe но и 2.exe? что делать? » - игнорировать и продолжать по пунктам.

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

id342181564@vk
03-04-2017, 10:34
Еще хотел спросить по поводу этого пункта ' Если выполняется 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
id342181564@vk, строка ' PScript = "C:\Windows\System32\" начинается с апострофа ', она не исполняется, мне она была нужна для отладки для ссылок на существующие файлы. В предыдущей строке определяется путь к скрипту, Вы требовали, чтобы екзешники лежали в той же папке, и в таких условиях это работает. Если все файлы лежат по одному пути, то в закомментированной строке уберите апостроф и пропишите свой путь. Если для каждого экзешника Вы хотите указывать персональный путь, примените PScript = "", а вместо имени файла укажите полный путь имени файла.

id342181564@vk
03-04-2017, 16:06
спасибо большое за столь развернутый ответ и труды) все работает отлично !
Хотел спросить вас еще на тему VBS, то это уже будет немного оффтоп - если конечно вас не затруднит?

megaloman
03-04-2017, 21:17
- тут по задумке скрипт должен не завершаться на выполнении 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, то это уже будет немного оффтоп - если конечно вас не затруднит Формулируйте проблему, надеюсь, найдутся желающие её разрешить. За спрос не бьют в нос.




© OSzone.net 2001-2012