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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Закрытие после выполнения и проверка если запущен

Ответить
Настройки темы
CMD/BAT - Закрытие после выполнения и проверка если запущен

Новый участник


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

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


Изменения
Автор: snipersu28
Дата: 12-08-2016
Описание: пробЫвал на пробОвал
Изображения
Тип файла: jpg Capture.jpg
(128.8 Kb, 5 просмотров)
Доброго времени суток. Столкнулся с такой проблемой:

Имеется: 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 не хватает, посоветуйте что-нибудь

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


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

Отправлено: 08:36, 12-08-2016

 

Ветеран


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

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


По-моему этого должно быть достаточно:
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:42, 12-08-2016 | #2



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

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


Ветеран


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

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


Даже усложним немного, но для надежности:
Код: Выделить весь код
@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
кстати каким триггером в шедуллере запускается, не при запуске-ли системы? Надо при входе пользователя в систему поставить, тогда весь софт уже будет подгружен и задержки будут не нужны, да при этом коде они и так не нужны.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:20, 12-08-2016 | #3


Новый участник


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

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


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

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

Отправлено: 10:24, 12-08-2016 | #4


Ветеран


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

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


По идее так сработает:
Код: Выделить весь код
@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
вообще, при двух-то вариантах можете и
Цитата snipersu28:
а для другого файла, сделать тоже самое только до exit »

Отправлено: 10:42, 12-08-2016 | #5


Новый участник


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

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


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
Спасибо

Отправлено: 05:54, 13-08-2016 | #6


Ветеран


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

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


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
.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:43, 13-08-2016 | #7


Новый участник


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

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


Цитата alpap:
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 работать ну в любом случае , работает отлично . Будете в Праге , дайте знать , устрою вам бесплатный сеанс с окулус

Отправлено: 18:46, 13-08-2016 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Закрытие после выполнения и проверка если запущен

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Удаление пераметра реестра если bat файл запущен в Безопасном режиме Sfero_ID Скриптовые языки администрирования Windows 6 05-06-2013 15:25
VBS/WSH/JS - [решено] Проверка ли запущен процесс Raf-9600 Скриптовые языки администрирования Windows 1 26-04-2012 13:15
CMD/BAT - [решено] Проверка запущен ли процесс Abricosio Скриптовые языки администрирования Windows 5 22-02-2012 00:17
CMD/BAT - [решено] Проверка в батнике запущен ли клиент. Timeless Ranger Скриптовые языки администрирования Windows 5 26-10-2011 09:52
Не работает WinWaitActive если скрипт запущен из Windows sheduler Kubik AutoIt 0 11-02-2011 16:28




 
Переход