Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скрипт для авто выключения одного приложения при ручном выключении другого (.exe)

Ответить
Настройки темы
CMD/BAT - [решено] Скрипт для авто выключения одного приложения при ручном выключении другого (.exe)

Аватара для vk_k14m@vk

Старожил


Сообщения: 342
Благодарности: 4


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: vk_k14m@vk
Дата: 03-06-2018
Использую подобный скрипт:
Код: Выделить весь код
@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.

И еще, если можно. Нужно сделать что б этот скрипт как-то скрывался. Сворачивался в трей или еще чего. Что б окно командной строки не маячило перед глазами.

-------
Взялся отвечать, отвечай до конца!


Отправлено: 10:33, 03-06-2018

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1218
Благодарности: 509

Профиль | Отправить PM | Цитировать


Цитата vk_k14m@vk:
Как то это слишком сложно... »
Нет там ничего сложного...

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"
и запускаете через него.

-------
scio me nihil scire. Ѫ


Отправлено: 18:04, 03-06-2018 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для vk_k14m@vk

Старожил


Сообщения: 342
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
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"?

Цитата YuS_2:
для скрытого запуска:
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:36.


Отправлено: 15:21, 04-06-2018 | #12


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1218
Благодарности: 509

Профиль | Отправить PM | Цитировать


Цитата vk_k14m@vk:
Про запуске program.exe и program2.exe запускаются не одноименные процессы. Эти программы что-то вроде лаунчеров. Которые запускают process.exe и process2.exe. »
Какие были условия, такое и решение.
Цитата vk_k14m@vk:
когда я запускаю скрипт, то он сразу запускает приложение Program.exe, после чего через 15 секунд запускает "вспомогательное" приложение Program2.exe. Далее нужно сделать, что б после выключения приложения Program.exe скрипт автоматически, через 15 секунд выключал и "вспомогательное" приложение Program2.exe. »
Нет?
Приведите в соответствие названия процессов и всё будет работать

Цитата vk_k14m@vk:
Не понятно что значит "imagename eq program.exe"? »
Код: Выделить весь код
tasklist /?
taskkill /?

По поводу скрипта hide.vbs:
А так:
Код: Выделить весь код
Set oTmp=CreateObject("WScript.Shell")
oTmp.Run WScript.Arguments(0), 0, False
?

-------
scio me nihil scire. Ѫ


Отправлено: 20:09, 04-06-2018 | #13


Аватара для vk_k14m@vk

Старожил


Сообщения: 342
Благодарности: 4

Профиль | Отправить PM | Цитировать



Как я уже говорил, забейте. Ваши скрипты только сильнее лагают. Буду пользоваться тем что сам собрал и вручную выключать приложения...

-------
Взялся отвечать, отвечай до конца!


Отправлено: 20:35, 04-06-2018 | #14


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


vk_k14m@vk, Итак, как я понимаю Вашу задачу после обсуждения непоняток:
vbs
1. Запускается первая программа PrgExe1 которая запускает процесс Prc1
2. Запускается вторая программа PrgExe2 которая запускает процесс Prc2
3. Пауза. Отслеживается наличие Prc1.
4. Если Prc1 отсутствует, убиваем Prc2. Завершаем скрипт.
5. Иначе возвращаемся на 3.

Код: Выделить весь код
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 + ".  Скрипт завершен"
Пропишите правильно папки программ, имена экзешников, имена процессов, ими запускаемых
Если постановка задачи иная, не томите, изложите подробно и четко. При кривой постановке скрипты обязательно, как Вы говорите, будут лагать. И придётся забить - на корзину работать нет охоты.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 05-06-2018 в 17:03. Причина: Доработал под требования заказчика. Добавил аварийное сообщение

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:33, 04-06-2018 | #15


Аватара для vk_k14m@vk

Старожил


Сообщения: 342
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Если постановка задачи иная, не томите, изложите подробно и четко. При кривой постановке скрипты обязательно, как Вы говорите, будут лагать. И придётся забить - на корзину работать нет охоты. »
Постановка правильна.
Цитата:
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 + ".  Скрипт завершен"
сохранил. При запуске скрипта такая ошибка.

-------
Взялся отвечать, отвечай до конца!


Последний раз редактировалось vk_k14m@vk, 04-06-2018 в 23:35.


Отправлено: 23:04, 04-06-2018 | #16


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1218
Благодарности: 509

Профиль | Отправить PM | Цитировать


Цитата vk_k14m@vk:
Как я уже говорил »
Для того, чтобы скрипт работал правильно, необходимо: правильно прописывать пути к запускаемым им программам (в данном случае run.bat), либо он должен находиться в одном каталоге с ними (тогда путь указывать необязательно, только наименование).
В общем, если кратко: поместите ярлык, скрипт hide.vbs и пакетник run.bat в один каталог. Предварительно проверьте работу пакетника, он должен работать самостоятельно, а после всех проверок и наладки, запускайте в скрытом режиме.

Цитата vk_k14m@vk:
Ваши скрипты только сильнее лагают. »
Я бы сказал так: чаще лагают руки их применяющие.
Описывайте подробнее и главное - точнее, условия задачи и тогда получите конфетку, а иначе на выходе будет всегда полуфабрикат, который придется допиливать самостоятельно... и это не претензия, если что, а просто констатация, причем касающаяся не только персонально Вас... это достаточно частое явление.

-------
scio me nihil scire. Ѫ


Отправлено: 23:06, 04-06-2018 | #17


Аватара для vk_k14m@vk

Старожил


Сообщения: 342
Благодарности: 4

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Для того, чтобы скрипт работал правильно, необходимо: правильно прописывать пути к запускаемым им программам (в данном случае run.bat), либо он должен находиться в одном каталоге с ними (тогда путь указывать необязательно, только наименование).
В общем, если кратко: поместите ярлык, скрипт hide.vbs и пакетник run.bat в один каталог. Предварительно проверьте работу пакетника, он должен работать самостоятельно, а после всех проверок и наладки, запускайте в скрытом режиме. »
Не поверишь, ярлык, скрипт и батник и так лежат в одной папке. Только скрипт выдает ошибку когда запускаю ярлык. А батник не завершает второй процесс при завершении первого.

-------
Взялся отвечать, отвечай до конца!


Отправлено: 23:17, 04-06-2018 | #18


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1218
Благодарности: 509

Профиль | Отправить PM | Цитировать


Цитата vk_k14m@vk:
А батник не завершает второй процесс при завершении первого. »
Естественно, т.к. после уточнения:
Цитата vk_k14m@vk:
Постановка правильна. »
он явно должен быть другим
Код: Выделить весь код
@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... для исключения проблем с кириллицей в путях...

-------
scio me nihil scire. Ѫ


Отправлено: 23:37, 04-06-2018 | #19


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата vk_k14m@vk:
Не работает, и вот почему. Про запуске program.exe и program2.exe запускаются не одноименные процессы. Эти программы что-то вроде лаунчеров. Которые запускают process.exe и process2.exe. »
Начинают выясняться антиресные подробности .

Цитата megaloman:
Если постановка задачи иная, не томите, изложите подробно и четко. При кривой постановке скрипты обязательно, как Вы говорите, будут лагать. И придётся забить - на корзину работать нет охоты. »
Работать можно. Токмо за отдельную оплату. После этого, как правило, и техзадание рождается быстро, и детали излагаются чётко.


Цитата YuS_2:
Код: Выделить весь код
wscript.exe //nologo …
»
Для wscript.exe параметр //nologo не требуется.

Отправлено: 23:56, 04-06-2018 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скрипт для авто выключения одного приложения при ручном выключении другого (.exe)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - как дождать завершения одного процесса для начала другого? ruslaw Скриптовые языки администрирования Windows 6 17-01-2018 12:00
Разное - как создать exe для запуска другого exe с параметрами, из той же папки vzli_izv Программирование и базы данных 12 08-06-2013 14:49
VBS/WSH/JS - Скрипт VBS для запуска .bat-файла при выключении компьютера(сценарий) W1nn1ep00h Скриптовые языки администрирования Windows 2 16-05-2013 16:31
CMD/BAT - [решено] bat скрипт - инсталятор модулей для одного java приложения bombording Скриптовые языки администрирования Windows 2 08-06-2009 15:33
Ошибка при выключении другого компьютера Irvix Microsoft Windows 95/98/Me (архив) 1 25-03-2003 08:38




 
Переход