Писал такой скрипт для себя.
Запускает Программу №2, если запускается Программа №1.
Описание в самом скрипте.
;~ *** Скрипт запускает Tool_2_ при старте Tool_1_
;~ *** Опционально следит за состоянием Tool_2_ и не дает ему закрыться во время работы Tool_1_
;~ *** Путь к Tool_2_ настраивается через переменную Tool_2__Path
;~ *** НАСТРОЙКИ
;~ Если перемнная Tool_2__Guard=1, скрипт следит за состоянием Tool_2_.
;~ Если по каким-либо причинам Tool_2_ закрывается, то скрипт запускает его вновь
;~ Т.е. скрипт не будет давать закрываться Tool_2_ во время открытого Tool_1_.
;~ Если перемнная Tool_2__Guard=0, то Tool_2_ будет запускаться только при старте Tool_1_.
;~ Во время работы Tool_1_, скрипт не будет вновь запускать Tool_2_, если он закроется.
Tool_2__Guard:=1
;~ Если переменная Close_Tool_2_=1, то Tool_2_ будет закрываться вместе с Tool_1_
Close_Tool_2_:=1
;~ Раскомментируйте следующую строку, что бы убрать иконку из трея
;~ В этом случае скрипт можно будет завершить через диспетчер задач
;~ #NoTrayIcon
;~ Укажите путь к Tool_2_
Tool_2__Path:="C:\Tool_2_.exe"
;~ Имя процесса Tool_2_
Tool_2_:="Tool_2_.exe"
; Имя процесса Tool_1_
Tool_1_:="Tool_1_.exe"
;~ ДАЛЕЕ НЕ РЕДАКТИРОВАТЬ
#SingleInstance, force ; перезапускать скрипт, если он уже запущен
SetBatchLines, -1 ; быстрое выполнение команд
DetectHiddenWindows, on ; обнаружение скрытых окон
Path:=RegExReplace(Tool_2__Path, "(.*)\\(.*)", "$1")
Target:=RegExReplace(Tool_2__Path, "(.*)\\(.*)", "$2")
If Tool_2__Guard ; если надо следить за состоянием процесса Tool_2_
SetTimer, Tool_2__Guard, 2000 ; запускаем таймер каждые 2 сек
Loop ; зацикливаем скрипт
{
Process, wait, %Tool_1_% ; ждем появления процесса Tool_1_
Process, Exist, %Tool_2_% ; проверяем процесс Tool_2_
If !ErrorLevel ; если не запущен
Run % "" Target "", %Path% ; запускаем
Process, WaitClose, %Tool_1_% ; ждем закрытия процесса Tool_1_
If !Close_Tool_2_ ; если не разрешено закрвать Tool_2_ при выходе из Tool_1_
continue ; не выполняем остальные команды
Process, Exist, %Tool_2_% ; проверяем состояние Tool_2_
If (PID:=ErrorLevel) ; если запущен, записываем его PID
Loop ; в цикле ждем закрытия Tool_2_ (для надежного закрытия Tool_2_, бывает не закрывается)
{
WinKill, ahk_pid %PID% ; закрываем Tool_2_
WinWaitClose, ahk_pid %PID%,, 1 ; ждем 1 сек
If !ErrorLevel ; если Tool_2_ закрыт
break ; выходим из цикла
}
}
Tool_2__Guard: ; таймер
Process, Exist, %Tool_1_% ; проверяем состояние Tool_1_
If !ErrorLevel ; если не запущен
return ; пропускаем остальные действия
Process, Exist, %Tool_2_% ; проверяем состояние Tool_2_
If !ErrorLevel ; если на запущен
Run % "" Target "", %Path% ; запускаем
return