Войти

Показать полную графическую версию : Закрытие после выполнения и проверка если запущен


snipersu28
12-08-2016, 08:36
Доброго времени суток. Столкнулся с такой проблемой:

Имеется: 6 компьютеров с Oculus Rift с клиентской игрой, и 1 компьютер серверный .

Требуется: При запуске 6 компьютеров игровых, надо что б автоматически запускалась программа для работы Oculus Rift (в настройке прграммы этой ф-ции нет), и клиент игры. Мониторов у компьютеров нет, да и не нужны они, но каждый раз при запуске вручную запускать довольно надоедливо, да и в случае неполадок, просто перезагрузить компьютер - было бы идеальным решением.

Что уже сделано: Самое интересное с чем я столкнулся, что Oculus не хотел запускаться обычными способами в автозапуске, если его ярлык поместить в автозагрузку, пробовал все варианты что знал сам и что нашел в интернете, реестр там, в папку в пуске автозагрузки, в общем тщетно. И только потом подумал, что можно сделать скрипт в .bat Файле , на запуск этих программ и уже bat файл встваить в автозагрузку, все заработало, только что требует каждый раз подтверждение администратора, просто нажать кнопку "ОК", но в этом теряется весь смысл, если для запуска надо опять по каждому компу проходить. В итоге вычитал где-то про планировщик задач, добавил в него выполнение бэтки, и поставил максимальные права, и выполнение этой задачи уже добавил в автозагрузку.

Радости моей не было предела, но единственное что иногда бывало что прграмма для очков Oculus не запускалась, не знаю почему, может не успевала , но если ее открыть еще раз вручную то все ок. В итоге решил так что добавил ожидание перед началом выполнение скрипта 10 секунд, что б комп успел сам загрузиться, потом выполнял запуск программы и игрового клиента, и после запуска добавил проверку, если этот процесс действительно появился в диспетчере задач, если ок, тогда ничего, иначе запусти ее еще раз. И всё стало супер, единственное что , после добавления этой проверки перестало закрываться само окно bat файла, как будто бы недоконца выполнился скрипт и он чего-то ждет, хотя обе программы уже запустились, но стоит закрыть вручную это bat окно , как программа Oculus закрывается тоже.

Собственно вопрос: Как сделать так что бы оно закрывалось после открытия обеих программ само (что в принципе оно и должно делать), просто уверен что прблема в написанном скрипте. Или как сделать так что б если его закрываешь, не закрывалась программа которую она открыла.

OculusClient.exe это программа для очков
Cosmos_Launcher.exe это сам клиент игры.
На скриншоте уже обе прграммы открыты, но окно не пропадает, и если его закрыть, то закроется сам Oculus.

Сам скрипт здесь:

@echo off
ping -n 10 127.0.0.1 > nul //Ожидание 10 секунд, что б дать запуститься системе
cd "C:\Program Files\Oculus\Support\oculus-client"
start OculusClient.exe //Запуск окулуса

ping -n 5 127.0.0.1 > nul //Подождать пока запустится

SetLocal EnableExtensions //Проверка если запустился, если нет, то попрбовать снова
Set ProcessName=OculusClient.exe
TaskList /FI "ImageName EQ %ProcessName%" | Find /I "%ProcessName%"
If %ErrorLevel% NEQ 0 Start C:\Program Files\Oculus\Support\oculus-client\%ProcessName%

cd "C:\COSMOS\Player" //Тоже самое только с игровым клиентом
start COSMOS_Launcher.exe

SetLocal EnableExtensions
Set ProcessName=COSMOS_Launcher.exe
TaskList /FI "ImageName EQ %ProcessName%" | Find /I "%ProcessName%"
If %ErrorLevel% NEQ 0 Start C:\COSMOS\Player\%ProcessName%

Уверен что ошибка в моей писанине, то ли if не закрыт правильно, то ли exit не хватает, посоветуйте что-нибудь

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


Спасибо большое заранее за ваши ответы. Мой первый пост, до этого был только читателем, очень надеюсь на вашу помощь ;-)

alpap
12-08-2016, 09:42
По-моему этого должно быть достаточно:

@echo off
cd /d "C:\Program Files\Oculus\Support\oculus-client"
set "pr=OculusClient.exe"
tasklist /fi "imagename eq %pr%"|find/i "%pr%" || start "" "%pr%"& >nul timeout /t 1 /nobreak
exit

alpap
12-08-2016, 10:20
Даже усложним немного, но для надежности:

@echo off
set "pr=OculusClient.exe"
cd /d "C:\Program Files\Oculus\Support\oculus-client"
cmd/c for /l %%a in () do @tasklist /fi "imagename eq %pr%"^|find/i "%pr%" ^&^& exit/b ^|^| (start "" "%pr%"^& exit/b)^& ^>nul timeout /t 1 /nobreak
exit


кстати каким триггером в шедуллере запускается, не при запуске-ли системы? Надо при входе пользователя в систему поставить, тогда весь софт уже будет подгружен и задержки будут не нужны, да при этом коде они и так не нужны.

snipersu28
12-08-2016, 10:24
кстати каким триггером в шедуллере запускается, не при запуске-ли системы? Надо при входе пользователя в систему поставить, тогда весь софт уже будет подгружен и задержки будут не нужны, да при этом коде они и так не нужны. »
Ой, я уже все компьютеры там по выключал, делаю все по удаленке, слишком поздно прочитал :-( Завтра тогда опробую, и скажу какой триггер использую, уже не помню.

А еще вопрос, это для OculusClient , а для другого файла, сделать тоже самое только до exit?

alpap
12-08-2016, 10:42
По идее так сработает:

@echo off
set "pr1=C:\Program Files\Oculus\Support\oculus-client\OculusClient.exe"
set "pr2=C:\COSMOS\Player\COSMOS_Launcher.exe"
for %%a in ("%pr1%","%pr2%") do call :pr "%%~dpa" "%%~nxa"
exit

:pr
cd /d "%~1"
cmd/c for /l %%a in () do @tasklist /fi "imagename eq %~2"^|find/i "%~2" ^&^& exit/b ^|^| (start "" "%~2"^& exit/b)^& ^>nul timeout /t 1 /nobreak
exit/b


вообще, при двух-то вариантах можете и а для другого файла, сделать тоже самое только до exit »

snipersu28
13-08-2016, 05:54
alpap,
alpap, Вроде такую комманду я использовал для создания ярлыка
schtasks /run /tn cmd_admin
Это нормально?

Что-то я сейчас попробовал все ок работает, перегрузил машину, и все больше доступа туда не имею :D Но в любом случае думаю что все ок, наверное что то с удаленным доступом случилось.

Мне бы было интересно не просто скопировать комманды , а разобраться что конкретно она делает, был бы очень благодарен за объяснение.

@echo off
set "pr1=C:\Program Files\Oculus\Support\oculus-client\OculusClient.exe" это создали переменную, в которой запомнили путь
set "pr2=C:\COSMOS\Player\COSMOS_Launcher.exe"
for %%a in ("%pr1%","%pr2%") do call :pr "%%~dpa" "%%~nxa" это фор цикл где непонятно сколько раз, берутся переменные , и делается скачсок на :pr с каким-то параметрами, что за они?
exit

:pr
cd /d "%~1" здесь в зависимости от переменной открывается разная папка
cmd/c for /l %%a in () do @tasklist /fi "imagename eq %~2"^|find/i "%~2" ^&^& exit/b ^|^| (start "" "%~2"^& exit/b)^& ^>nul timeout /t 1 /nobreak тут несовсем понятно, но тоже фор цикл проходит по диспетчеру задач, в поиске процесса, а вот дальше бы было интересно подробнее что именно все значит
exit/b

Спасибо

alpap
13-08-2016, 15:43
snipersu28,
Все равно без знания азов и не почитав о команде в справке мало что поймете:

@echo off
set "pr1=C:\Program Files\Oculus\Support\oculus-client\OculusClient.exe" &: Задаем путь к файлу в переменную
set "pr2=C:\COSMOS\Player\COSMOS_Launcher.exe" &: Задаем путь к файлу в переменную
for %%a in ("%pr1%","%pr2%") do call :pr "%%~dpa" "%%~nxa" &: Перебираем в цикле заданные пути и вытаскиваем в переменную %%~dpa путь к папке, а в переменную %%~nxa имя и расширение файла и передаем эти переменные в подпрограмму с помощью параметров
exit

:pr
cd /d "%~1" &: Переходим в папку, указанную первым параметром
rem Тут, если интересно, сначала бесконечный счет, проверка, есть ли процесс и выход, если есть, иначе запуск его и выход, чтобы не перегружать процессор, проверка раз в секунду timeout /t 1 /nobreak
cmd/c for /l %%a in () do @tasklist /fi "imagename eq %~2"^|find/i "%~2" ^&^& exit/b ^|^| (start "" "%~2"^& exit/b)^& ^>nul timeout /t 1 /nobreak
exit/b
.

snipersu28
13-08-2016, 18:46
snipersu28,
Все равно без знания азов и не почитав о команде в справке мало что поймете:

@echo off
set "pr1=C:\Program Files\Oculus\Support\oculus-client\OculusClient.exe" &: Задаем путь к файлу в переменную
set "pr2=C:\COSMOS\Player\COSMOS_Launcher.exe" &: Задаем путь к файлу в переменную
for %%a in ("%pr1%","%pr2%") do call :pr "%%~dpa" "%%~nxa" &: Перебираем в цикле заданные пути и вытаскиваем в переменную %%~dpa путь к папке, а в переменную %%~nxa имя и расширение файла и передаем эти переменные в подпрограмму с помощью параметров
exit

:pr
cd /d "%~1" &: Переходим в папку, указанную первым параметром
rem Тут, если интересно, сначала бесконечный счет, проверка, есть ли процесс и выход, если есть, иначе запуск его и выход, чтобы не перегружать процессор, проверка раз в секунду timeout /t 1 /nobreak
cmd/c for /l %%a in () do @tasklist /fi "imagename eq %~2"^|find/i "%~2" ^&^& exit/b ^|^| (start "" "%~2"^& exit/b)^& ^>nul timeout /t 1 /nobreak
exit/b
.

Вроде как учили в Unix работать :) ну в любом случае , работает отлично . Будете в Праге , дайте знать , устрою вам бесплатный сеанс с окулус :)




© OSzone.net 2001-2012