Показать полную графическую версию : [решено] Скрипт для авто выключения одного приложения при ручном выключении другого (.exe)
vk_k14m@vk
03-06-2018, 10:33
Использую подобный скрипт:
@ECHO OFF
START "" Program.exe
ping 127.0.0.1 -n 15 >nul
START "" Program2.exe
Тоесть когда я запускаю скрипт, то он сразу запускает приложение Program.exe, после чего через 15 секунд запускает "вспомогательное" приложение Program2.exe. Далее нужно сделать, что б после выключения приложения Program.exe скрипт автоматически, через 15 секунд выключал и "вспомогательное" приложение Program2.exe.
И еще, если можно. Нужно сделать что б этот скрипт как-то скрывался. Сворачивался в трей или еще чего. Что б окно командной строки не маячило перед глазами.
через 15 секунд выключал и "вспомогательное" приложение Program2.exe. »
Выключал - громко сказано. Всё что умеет чистый cmd - "убивать" приложения командой taskkill. Если устроит - это организовать несложно.
Что-то другое, т.е. для корректного завершение работы, а также для скрытия окна CMD - как минимум, понадобится WSH, powershell или внешние приложения...
Что[]б окно командной строки не маячило перед глазами. »
Делайте не пакетный файл, а VB-скрипт. Им же организуете и убиение процесса через заданное время.
И тогда никаких пингов — а штатная директива Sleep, не отнимающая у системы лишнее время на обработку.
Всё что умеет чистый cmd - "убивать" приложения командой taskkill. »
Вообще-то, нет: именно taskkill.exe (без использования параметра /f) делает попытку закрытия главного окна приложения (путём отсылки сообщения). WSH этого не умеет (в Вашей трактовке — умеет только «убивать» процесс).
vk_k14m@vk
03-06-2018, 14:10
Делайте не пакетный файл, а VB-скрипт. Им же организуете и убиение процесса через заданное время.
И тогда никаких пингов — а штатная директива Sleep, не отнимающая у системы лишнее время на обработку. »
Мне не нужно убиение процесса через заданное время. Мне нужно убиение второго процесса когда первый процесс завершается. Так как этот процесс может длится 20 минут, а может 6 часов. Время его работы не фиксировано. Грубо говоря, когда я закрываю первое приложение, второе тоже должно закрыться. Не важно каким способом.
Делайте не пакетный файл, а VB-скрипт. Им же организуете и убиение процесса через заданное время.
И тогда никаких пингов — а штатная директива Sleep, не отнимающая у системы лишнее время на обработку. »
Я без понятия что такое VB-скрипт.
Мне нужно убиение второго процесса когда первый процесс завершается »
Это можно сделать, добавив параметр /wait к старту первой программы, но тогда, скорее всего, придется запускать вторую программу предварительно дополнительным батником со своим таймером)))
vk_k14m@vk
03-06-2018, 15:48
Это можно сделать, добавив параметр /wait к старту первой программы, но тогда, скорее всего, придется запускать вторую программу предварительно дополнительным батником со своим таймером))) »
Я знаю что так можно сделать. Но такой вариант мне не подходит.
Можно вообще вручную запускать обе программы а потом вручную обе закрывать.
именно taskkill.exe (без использования параметра /f) делает попытку закрытия главного окна приложения (путём отсылки сообщения). »
Верно, это я перепутал с mortscript-ом, там kill именно kill... давно не пользовался... :)
WSH этого не умеет »
Хмм, почему-то думал, что там есть CloseMainWindow()...
Ну, тогда powershell поможет...
Я знаю что так можно сделать. Но такой вариант мне не подходит. »
Тогда зациклить мониторинг наличия процесса через каждые 15 сек и закрывать вторую программу, если первая не обнаруживается. Но батник будет резидентом, т.е. постоянно находиться в памяти, до закрытия второго процесса.
vk_k14m@vk
03-06-2018, 16:24
А ладно. Забейте. Как то это слишком сложно...
megaloman
03-06-2018, 17:24
PrgDir1 = "D:\Games\Marriage V2.3"
PrgExe1 = "marriage.exe"
PrgDir2 = "D:\Games\BUBBLES3"
PrgExe2 = "BS3.EXE"
Paus = 15 'Пауза сек
Set WMI = GetObject("winMgmts:")
Set WShell = CreateObject("WScript.Shell")
' Если PrgExe1 запущен, убъем его
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + PrgExe1 + """")
For Each Process In Processes
Process.Terminate
Next
' Запустим PrgExe1
WShell.CurrentDirectory = PrgDir1
R1 = WShell.Run(PrgExe1, 7, False)
WScript.Sleep Paus * 1000
' Если PrgExe1 запустилась, запустим PrgExe2
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + PrgExe1 + """")
If Processes.Count > 0 Then
WShell.CurrentDirectory = PrgDir2
R2 = WShell.Run(PrgExe2, 7, False)
Else
WScript.Quit 1
End If
' Опрашиваем. Если нет PrgExe1 убъем PrgExe2 и завершим скрипт
Do
WScript.Sleep Paus * 1000
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + PrgExe1 + """")
If Processes.Count = 0 Then
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + PrgExe2 + """")
For Each Process In Processes
Process.Terminate
Next
Exit Do
End If
Loop
MsgBox "Нет " + PrgExe1 + " и " + PrgExe2 + ". Скрипт завершен"
Как то это слишком сложно... »
Нет там ничего сложного...
run.bat
@echo off
start "" "program.exe"
:loop
>nul timeout /t 15
tasklist /fi "imagename eq program2.exe"|>nul find /i "program2.exe"||start "" "program2.exe"
tasklist /fi "imagename eq program.exe"|>nul find /i "program.exe"&&goto loop||goto close
goto loop
:close
taskkill /fi "imagename eq program2.exe"
для скрытого запуска:
hide.vbs
Set oTmp=CreateObject("WScript.Shell")
for n = 2 to WScript.Arguments.count
Args = Args & " " & WScript.Arguments(n-1)
next
oTmp.Run WScript.Arguments(0) & Args, 0, False
Создаёте ярлык со следующей строкой запуска:
wscript.exe //nologo hide.vbs "run.bat"
и запускаете через него.
vk_k14m@vk
04-06-2018, 15:21
run.bat
@echo off
start "" "program.exe"
:loop
>nul timeout /t 15
tasklist /fi "imagename eq program2.exe"|>nul find /i "process2.exe"||start "" "program2.exe"
tasklist /fi "imagename eq program.exe"|>nul find /i "process1.exe"&&goto loop||goto close
goto loop
:close
taskkill /fi "imagename eq program2.exe"»
Не работает, и вот почему. Про запуске program.exe и program2.exe запускаются не одноименные процессы. Эти программы что-то вроде лаунчеров. Которые запускают process.exe и process2.exe.
И еще. Не понятно что значит "imagename eq program.exe"?
для скрытого запуска:
hide.vbs
Set oTmp=CreateObject("WScript.Shell")
for n = 2 to WScript.Arguments.count
Args = Args & " " & WScript.Arguments(n-1)
next
oTmp.Run WScript.Arguments(0) & Args, 0, False
Создаёте ярлык со следующей строкой запуска:
wscript.exe //nologo hide.vbs "run.bat"
и запускаете через него. »
http://i105.fastpic.ru/big/2018/0604/a7/84be4962c39c1a28638aa9a3a3d187a7.png
Про запуске program.exe и program2.exe запускаются не одноименные процессы. Эти программы что-то вроде лаунчеров. Которые запускают process.exe и process2.exe. »
Какие были условия, такое и решение.когда я запускаю скрипт, то он сразу запускает приложение Program.exe, после чего через 15 секунд запускает "вспомогательное" приложение Program2.exe. Далее нужно сделать, что б после выключения приложения Program.exe скрипт автоматически, через 15 секунд выключал и "вспомогательное" приложение Program2.exe. »
Нет?
Приведите в соответствие названия процессов и всё будет работать
Не понятно что значит "imagename eq program.exe"? »
tasklist /?
taskkill /?
По поводу скрипта hide.vbs:
А так:
Set oTmp=CreateObject("WScript.Shell")
oTmp.Run WScript.Arguments(0), 0, False
?
vk_k14m@vk
04-06-2018, 20:35
http://i105.fastpic.ru/big/2018/0604/0f/ac82cb2b86567712ea09e371e8e4390f.png
Как я уже говорил, забейте. Ваши скрипты только сильнее лагают. Буду пользоваться тем что сам собрал и вручную выключать приложения...
megaloman
04-06-2018, 22:33
vk_k14m@vk, Итак, как я понимаю Вашу задачу после обсуждения непоняток:
PrgDir1 = "D:\Program Files\MTA Province" ' Папка с первой программой
PrgExe1 = "MTA\MTA.exe" ' Exe-файл первой программы
Prc1 = "proxy_sa.exe" ' Процесс запущенный первой программой
PrgDir2 = "C:\Program Files (x86)\Bandicam" ' Папка со второй программой
PrgExe2 = "Loader.exe" ' Exe-файл второй программы
Prc2 = "bdcam.exe" ' Процесс запущенный второй программой
Paus = 15 'Пауза сек
Set WMI = GetObject("winMgmts:")
Set WShell = CreateObject("WScript.Shell")
' Если Prс1 запущен, убъем его
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + Prc1 + """")
For Each Process In Processes
Process.Terminate
Next
' Запустим PrgExe1
WShell.CurrentDirectory = PrgDir1
R1 = WShell.Run("""" + PrgDir1 + "\" + PrgExe1 + """", 7, False)
WScript.Sleep Paus * 1000
' Если Prс1 запустилась, запустим PrgExe2
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + Prc1 + """")
If Processes.Count > 0 Then
WShell.CurrentDirectory = PrgDir2
R2 = WShell.Run("""" + PrgDir2 + "\" + PrgExe2 + """", 7, False)
Else
Msg = "Текущая папка" + vbCrLf + WShell.CurrentDirectory + vbCrLf + vbCrLf
MsgBox Msg + "Запуск" + vbCrLf + """" + PrgDir1 + "\" + PrgExe1 + """" + vbCrLf + "не запустил процесс" + vbCrLf + """" + Prc1 + """"
WScript.Quit 1
End If
' Опрашиваем. Если нет Prс1 убъем Prс2 и завершим скрипт
Do
WScript.Sleep Paus * 1000
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + Prc1 + """")
If Processes.Count = 0 Then
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + Prc2 + """")
For Each Process In Processes
Process.Terminate
Next
Exit Do
End If
Loop
MsgBox "Нет " + Prc1 + " и " + Prc2 + ". Скрипт завершен"
Пропишите правильно папки программ, имена экзешников, имена процессов, ими запускаемыхЕсли постановка задачи иная, не томите, изложите подробно и четко. При кривой постановке скрипты обязательно, как Вы говорите, будут лагать. И придётся забить - на корзину работать нет охоты.
vk_k14m@vk
04-06-2018, 23:04
Если постановка задачи иная, не томите, изложите подробно и четко. При кривой постановке скрипты обязательно, как Вы говорите, будут лагать. И придётся забить - на корзину работать нет охоты. »
Постановка правильна.
1. Запускается первая программа "D:\Program Files\MTA Province\MTA\MTA.exe" которая запускает процесс "D:\Program Files\MTA Province\proxy_sa.exe"
2. Запускается вторая программа "C:\Program Files (x86)\Bandicam\Loader.exe" которая запускает процесс "C:\Program Files (x86)\Bandicam\bdcam.exe"
3. Пауза. Отслеживается наличие "D:\Program Files\MTA Province\proxy_sa.exe".
4. Если "D:\Program Files\MTA Province\proxy_sa.exe" отсутствует, убиваем "C:\Program Files (x86)\Bandicam\bdcam.exe". Завершаем скрипт.
5. Иначе возвращаемся на 3.
Такс. Создал файл "start.vbs", вписал в него такой текст:PrgDir1 = "D:\Program Files\MTA Province" ' Папка с первой программой
PrgExe1 = "MTA\MTA.exe" ' Exe-файл первой программы
Prc1 = "proxy_sa.exe" ' Процесс запущенный первой программой
PrgDir2 = "C:\Program Files (x86)\Bandicam" ' Папка со второй программой
PrgExe2 = "Loader.exe" ' Exe-файл второй программы
Prc2 = "bdcam.exe" ' Процесс запущенный второй программой
Paus = 15 'Пауза сек
Set WMI = GetObject("winMgmts:")
Set WShell = CreateObject("WScript.Shell")
' Если Prс1 запущен, убъем его
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + Prc1 + """")
For Each Process In Processes
Process.Terminate
Next
' Запустим PrgExe1
WShell.CurrentDirectory = PrgDir1
R1 = WShell.Run(PrgExe1, 7, False)
WScript.Sleep Paus * 1000
' Если Prс1 запустилась, запустим PrgExe2
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + Prc1 + """")
If Processes.Count > 0 Then
WShell.CurrentDirectory = PrgDir2
R2 = WShell.Run(PrgExe2, 7, False)
Else
WScript.Quit 1
End If
' Опрашиваем. Если нет Prс1 убъем Prс2 и завершим скрипт
Do
WScript.Sleep Paus * 1000
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + Prc1 + """")
If Processes.Count = 0 Then
Set Processes = WMI.ExecQuery("Select *From Win32_Process Where Name=" + """" + Prc2 + """")
For Each Process In Processes
Process.Terminate
Next
Exit Do
End If
Loop
MsgBox "Нет " + Prc1 + " и " + Prc2 + ". Скрипт завершен"сохранил. При запуске скрипта такая ошибка.
http://i105.fastpic.ru/big/2018/0605/0e/473e3e7c3931ac6664f95996897b280e.png
Как я уже говорил »
Для того, чтобы скрипт работал правильно, необходимо: правильно прописывать пути к запускаемым им программам (в данном случае run.bat), либо он должен находиться в одном каталоге с ними (тогда путь указывать необязательно, только наименование).
В общем, если кратко: поместите ярлык, скрипт hide.vbs и пакетник run.bat в один каталог. Предварительно проверьте работу пакетника, он должен работать самостоятельно, а после всех проверок и наладки, запускайте в скрытом режиме.
Ваши скрипты только сильнее лагают. »
Я бы сказал так: чаще лагают руки их применяющие. :)
Описывайте подробнее и главное - точнее, условия задачи и тогда получите конфетку, а иначе на выходе будет всегда полуфабрикат, который придется допиливать самостоятельно... и это не претензия, если что, а просто констатация, причем касающаяся не только персонально Вас... это достаточно частое явление. :)
vk_k14m@vk
04-06-2018, 23:17
Для того, чтобы скрипт работал правильно, необходимо: правильно прописывать пути к запускаемым им программам (в данном случае run.bat), либо он должен находиться в одном каталоге с ними (тогда путь указывать необязательно, только наименование).
В общем, если кратко: поместите ярлык, скрипт hide.vbs и пакетник run.bat в один каталог. Предварительно проверьте работу пакетника, он должен работать самостоятельно, а после всех проверок и наладки, запускайте в скрытом режиме. »
Не поверишь, ярлык, скрипт и батник и так лежат в одной папке. Только скрипт выдает ошибку когда запускаю ярлык. А батник не завершает второй процесс при завершении первого.
А батник не завершает второй процесс при завершении первого. »
Естественно, т.к. после уточнения:
Постановка правильна. »
он явно должен быть другим :)
@echo off
set "prg1=D:\Program Files\MTA Province\MTA\MTA.exe"
set "prg2=C:\Program Files (x86)\Bandicam\Loader.exe"
set "prc1=proxy_sa.exe"
set "prc2=bdcam.exe"
start "" "%prg1%"
:loop
>nul timeout /t 15
tasklist /fi "imagename eq %prc2%"|>nul find /i "%prc2%"||start "" "%prg2%"
tasklist /fi "imagename eq %prc1%"|>nul find /i "%prc1%"&&goto loop||goto close
goto loop
:close
taskkill /fi "imagename eq %prc2%"
а hide.vbs поправьте так:
Set oTmp=CreateObject("WScript.Shell")
oTmp.Run """" & WScript.Arguments(0) & """", 0, False
Затем в ярлыке укажите абсолютные пути к самому hide.vbs и run.bat
wscript.exe //nologo "D:\здесь путь к папке где он находится\hide.vbs" "E:\здесь путь к папке где он находится\run.bat"
- в таком варианте им не обязательно находится в одном каталоге.
PS На всякий случай: "батник" сохраняйте в кодировке 866, скрипт vbs в кодировке 1251... для исключения проблем с кириллицей в путях...
Не работает, и вот почему. Про запуске program.exe и program2.exe запускаются не одноименные процессы. Эти программы что-то вроде лаунчеров. Которые запускают process.exe и process2.exe. »
Начинают выясняться антиресные подробности ;).
Если постановка задачи иная, не томите, изложите подробно и четко. При кривой постановке скрипты обязательно, как Вы говорите, будут лагать. И придётся забить - на корзину работать нет охоты. »
Работать можно. Токмо за отдельную оплату. После этого, как правило, и техзадание рождается быстро, и детали излагаются чётко.
wscript.exe //nologo …»
Для wscript.exe параметр //nologo не требуется.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.