Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   CMD/BAT - [решено] Скрипт для авто выключения одного приложения при ручном выключении (http://forum.oszone.net/showthread.php?t=338288)

vk_k14m@vk 17-12-2018 23:29 2846657

CMD/BAT - [решено] Скрипт для авто выключения одного приложения при ручном выключении
 
Однажды я уже задавал подобный вопрос, но нужного ответа тогда я так и не получил. Так что это моя вторая попытка.

Есть некая игра, назовем её MTA Province. И приложение для записи видео с экрана - Bandicam. Нужно создать скрипт, при запуске которого сначала должна запускаться игра, а потом через секунд 5 - приложение для записи видео. Приложение нужно просто запустить, авто запись в нём включается сама. Но это ещё не весь скрипт. Нужно что б скрипт всё ещё оставался активен и всё время отслеживал (желательно в свёрнутом виде), запущена ли игра или нет. И в случает выключения игры, скрипт должен так же выключить и программу для записи видео. Ну и сам скрипт после этого со спокойной душей тоже должен закрыться.

Думаю цель ясна. Запускаю игру - начинается запись видео. Выключаю игру - запись прекращается.

НО. Приложение для запуска игры, запускает иной процесс, и к тому же не один (Смотреть вложение).

Да и Bandicam, запускается одним приложением, но запускает другой процесс (Смотреть второе вложение).

И вот я не соображаю как написать этот скрипт. Надеюсь на понимает, и помощь от знающих людей. Информации НА ЭТОТ РАЗ я надеюсь дал достаточно...

Iska 17-12-2018 23:56 2846664

Покажите то же самое, только скриншотами Process Explorer'а. Уточните, какие именно исполняемые файлы Вы запускаете для игры и для записи видео. Запишите видео, на котором покажите, как Вы делаете описанные выше действия вручную.

vk_k14m@vk 18-12-2018 00:00 2846667

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

vk_k14m@vk 18-12-2018 00:06 2846670

А скриншот вот

Iska 18-12-2018 00:19 2846672

Покажите свойства того, чем Вы запускаете процессы «Multi Theft Auto.exe» и «bdcam.exe» (например, свойства ярлыков). Конкретно интересуют полный путь к исполняемому файлу, рабочий каталог, требуется ли запуск с административными привилегиями, передаваемые параметры и т.п.

vk_k14m@vk 18-12-2018 00:31 2846676

Исполняемые файлы:

"D:\Games\MTA Province\MTA\Multi Theft Auto.exe"
Скрытый текст

"C:\Program Files (x86)\Bandicam\Loader.exe"
Скрытый текст


В свойствах ярлыков галочка "Запуск от имени администратора" нигде не стоит.

Видео

Iska 18-12-2018 02:33 2846683

vk_k14m@vk, за мельтешением картинок на Вашем Рабочем столе ничего разглядеть невозможно, ни где Вы возите мышкой, ни где что нажимаете. И большой баннер над панелью задач этому тоже не помогает.

Можете пробовать. На WSH:
Скрытый текст
Код:

Option Explicit

Const strPath2GameProcess = "D:\Games\MTA Province\MTA\Multi Theft Auto.exe"
Const strPath2VideoRecordingProcess = "C:\Program Files (x86)\Bandicam\Loader.exe"
Const strName4StopProcess = "bdcam64.bin"


Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim objFSO

Dim lngGameProcessID
Dim lngVideoRecordingProcessID
Dim lngVideoRecordingParentProcessID


Set objSWbemServicesEx = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2")
Set objSWbemObjectEx  = objSWbemServicesEx.Get("Win32_Process")

Set objFSO            = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strPath2GameProcess) Then
        If objFSO.FileExists(strPath2GameProcess) Then
                If objSWbemObjectEx.Create(strPath2GameProcess, objFSO.GetParentFolderName(strPath2GameProcess), Nothing, lngGameProcessID) = 0 Then
                        WScript.Sleep 5 * 1000
                       
                        If objSWbemObjectEx.Create(strPath2VideoRecordingProcess, objFSO.GetParentFolderName(strPath2VideoRecordingProcess), Nothing, lngVideoRecordingProcessID) = 0 Then
                                objSWbemServicesEx.ExecNotificationQuery( _
                                        "SELECT * FROM __InstanceDeletionEvent WITHIN 1 " & _
                                        "WHERE TargetInstance ISA 'Win32_Process' AND " & _
                                        "TargetInstance.ProcessID = " & CStr(lngGameProcessID) & "" _
                                ).NextEvent
                               
                                For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery( _
                                        "SELECT * FROM Win32_Process WHERE Name = '" & strName4StopProcess & "'" _
                                )
                                        lngVideoRecordingParentProcessID = objSWbemObjectEx.ParentProcessID
                                       
                                        If objSWbemObjectEx.Terminate() = 0 Then
                                                If objSWbemServicesEx.Get("Win32_Process.Handle=" & CStr(lngVideoRecordingParentProcessID)).Terminate() = 0 Then
                                                       
                                                Else
                                                        WScript.Echo "Can't terminate process with PID [" & CStr(lngVideoRecordingParentProcessID) & "]."
                                                End If
                                        Else
                                                WScript.Echo "Can't terminate process with PID [" & CStr(objSWbemObjectEx.ProcessID) & "]."
                                        End If
                                       
                                        Exit For
                                Next
                        Else
                                WScript.Echo "Can't execute process [" & strPath2VideoRecordingProcess & "]."
                                WScript.Quit 4
                        End If
                Else
                        WScript.Echo "Can't execute process [" & strPath2GameProcess & "]."
                        WScript.Quit 3
                End If
        Else
                WScript.Echo "Can't find file [" & strPath2VideoRecordingProcess & "]."
                WScript.Quit 1
        End If
Else
        WScript.Echo "Can't find file [" & strPath2GameProcess & "]."
        WScript.Quit 1
End If

Set objFSO            = Nothing

Set objSWbemObjectEx  = Nothing
Set objSWbemServicesEx = Nothing

WScript.Quit 0


Запускаете скрипт, ждёте запуска игры, ждёте пять секунд, нажимаете F12 (или иную горячую клавишу, какая там у Вас настроена) для начала записи видео. Закончили — нажали F12 для остановки записи видео, затем только закрыли игру.

vk_k14m@vk 18-12-2018 02:51 2846684

Цитата:

Цитата Iska
Запускаете скрипт, ждёте запуска игры, ждёте пять секунд, нажимаете F12 (или иную горячую клавишу, какая там у Вас настроена) для начала записи видео. Закончили — нажали F12 для остановки записи видео, затем только закрыли игру. »

С F12 не понял, зачем мне ее нажимать?

vk_k14m@vk 18-12-2018 03:08 2846685

Цитата:

Цитата Iska
за мельтешением картинок на Вашем Рабочем столе ничего разглядеть невозможно, ни где Вы возите мышкой, ни где что нажимаете. И большой баннер над панелью задач этому тоже не помогает. »

А что там разглядывать? Два раза кликнул на ярлык "MTA Province". Дождался запуска игры. Свернул игру. Два раза нажал на ярлык "Bandicam" (запись началась). Развернул игру. Вышел из игры. Открыл скрытые значки трея. Кликнул на "Bandicam", остановил запись и закрыл приложение. Хотя последние действия были не обязательны. Bandicam записывает видео сразу в *.mp4
Никакие дополнительные действия вроде перекодирования, остановки и сохранения записи не нужны. Если принудительно закрыть программу видео так же не повредится.

Цитата:

Цитата Iska
Можете пробовать. На WSH: »

А как "собрать" этот скрипт, что б не было такой ошибки




И еще вопрос на будущее. Если я захочу сделать подобный скрипт, но для какой-то другой игры. Мне просто изменить путь в этой строчке
Код:

Const strPath2GameProcess = "D:\Games\MTA Province\MTA\Multi Theft Auto.exe"
на путь к другой запускаемой игре? Или еще что-то переписывать нужно?

Iska 18-12-2018 05:05 2846689

Цитата:

Цитата vk_k14m@vk
С F12 не понял, зачем мне ее нажимать? »

Для начала и остановки процесса захвата видео.

Цитата:

Цитата vk_k14m@vk
(запись началась). »

Покажите Ваши настройки приложения, которые отвечают за автоматический старт записи.

Цитата:

Цитата vk_k14m@vk
Хотя последние действия были не обязательны. »

Обязательны. Иначе будет у Вас оборванное видео. Особенно, когда речь идёт об mpeg.

Цитата:

Цитата vk_k14m@vk
Если принудительно закрыть программу видео так же не повредится. »

Есть большие сомнения на этот счёт.

Цитата:

Цитата vk_k14m@vk
А как "собрать" этот скрипт, что б не было такой ошибки »

Сохранять в файл с расширением .vbs, а не .wsh (.wsh — файл параметров для сценария скрипта).

Цитата:

Цитата vk_k14m@vk
И еще вопрос на будущее. Если я захочу сделать подобный скрипт, но для какой-то другой игры. Мне просто изменить путь в этой строчке »

Теоретически — да. Практически же — этого гарантировать нельзя.

vk_k14m@vk 18-12-2018 05:45 2846692

Цитата:

Цитата Iska
Покажите Ваши настройки приложения, которые отвечают за автоматический старт записи. »

Скрытый текст


Цитата:

Цитата Iska
Обязательны. Иначе будет у Вас оборванное видео. Особенно, когда речь идёт об mpeg. »

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

Цитата:

Цитата Iska
Есть большие сомнения на этот счёт. »

Как видно из видео, все работает. Я не делал с видео никаких дополнительных манипуляций. Просто записал как есть и загрузил.

Цитата:

Цитата Iska
Сохранять в файл с расширением .vbs, а не .wsh (.wsh — файл параметров для сценария скрипта). »

Теперь другая ошибка. Сразу после запуска скрипта.


Цитата:

Цитата Iska
Теоретически — да. Практически же — этого гарантировать нельзя. »

В таком случае снова обращусь на форум)

Iska 18-12-2018 07:15 2846694

Скрипт по какой-то причине не может запустить на исполнение файл "C:\Program Files (x86)\Bandicam\Loader.exe" :).

vk_k14m@vk 18-12-2018 07:26 2846695

Цитата:

Цитата Iska
Скрипт по какой-то причине не может запустить на исполнение файл "C:\Program Files (x86)\Bandicam\Loader.exe" . »

Понял ошибку. Bandicam все таки нужны права администратора =_=

Iska 18-12-2018 08:14 2846698

Цитата:

Цитата vk_k14m@vk
Bandicam все таки нужны права администратора =_= »

Ну, фигурный щит в правом нижнем углу значка ярлыка как бы намекает об этом ;). Можно запускать скрипт с административными привилегиями (ярлык на wscript.exe, аргументом к нему — путь к скрипту), тогда всё запущенное из-под него также получит административные привилегии.

vk_k14m@vk 18-12-2018 17:58 2846849

Такс. С запуском сейчас все в порядке. А вот с завершением процесса проблемы. После выключения игры ни "bdcam64.bin", ни "bdcam.exe" не завершается. К тому же, если вручную завершить процесс "bdcam64.bin" то запись не прекращается, и идет дальше. Нужно именно "bdcam.exe" выключать. Заменил в скрипте "bdcam64.bin" на "bdcam.exe", и ничего не изменилось. Скрипт не может, или не хочет завершать этот процесс. Да и процесс самого скрипта не завершается. И если много раз его запускать, то он дублируется.
Скрытый текст

Iska 18-12-2018 18:20 2846861

vk_k14m@vk, я уже написал Вам, что нужно сделать:
Цитата:

Цитата Iska
Можно запускать скрипт с административными привилегиями (ярлык на wscript.exe, аргументом к нему — путь к скрипту), тогда всё запущенное из-под него также получит административные привилегии. »

Цитата:

Цитата vk_k14m@vk
Нужно именно "bdcam.exe" выключать. »

Вы дерево процессов видели? Это:
Скрытый текст
приведённый Вами скриншот, если что. Завершать нужно и одно приложение, и другое. Сначала ищется и завершается процесс bdcam64.bin, затем, уже напрямую, завершается его родительский процесс, коим является bdcam.exe.

Цитата:

Цитата vk_k14m@vk
Заменил в скрипте "bdcam64.bin" на "bdcam.exe", и ничего не изменилось. »

Зачем? Метод научного тыка здесь не работает.

Цитата:

Цитата vk_k14m@vk
После выключения игры ни "bdcam64.bin", ни "bdcam.exe" не завершается. »

Раз не завершается, и нет никаких сообщений — значит, до попыток завершения дело даже не доходит. Покажите скриншот окна Process Explorer'а после: «после выключения игры».

Цитата:

Цитата vk_k14m@vk
Да и процесс самого скрипта не завершается.»

Естественно.

Цитата:

Цитата vk_k14m@vk
И если много раз его запускать, то он дублируется. »

Естественно.

vk_k14m@vk 18-12-2018 18:25 2846862

Цитата:

Цитата Iska
Раз не завершается, и нет никаких сообщений — значит, до попыток завершения дело даже не доходит. Покажите скриншот окна Process Explorer'а после: «после выключения игры». »


Iska 18-12-2018 18:44 2846864

vk_k14m@vk, «огласите весь список, пожалуйста»™.

vk_k14m@vk 19-12-2018 00:51 2846924

Цитата:

Цитата Iska
«огласите весь список, пожалуйста»™. »

Скрытый текст











Iska 19-12-2018 02:03 2846929

vk_k14m@vk, как-то странно у Вас некоторые вещи выглядят.

А так особо идей нет. Могу лишь констатировать, что у меня всё работает, как было заказано (за исключением того факта, что, если делать захват видео на полном экране, и Bandicam принудительно снимать, то файл видео оказывается запоротым).

vk_k14m@vk 19-12-2018 13:33 2847007

Цитата:

Цитата Iska
как-то странно у Вас некоторые вещи выглядят. »

Что конкретно? Винда у меня пиратская, к тому же поломанная. Защитник отсутствует, магазин Windows не работает и все в этом роде.

alpap 19-12-2018 14:30 2847022

добавить еще суперпиратский Bandicam и можно не удивляться почему его ничем не убить в этой системе.

vk_k14m@vk 19-12-2018 14:36 2847024

Цитата:

Цитата alpap
добавить еще суперпиратский Bandicam и можно не удивляться почему его ничем не убить в этой системе. »

Диспетчер задач почему-то может его убить

Iska 19-12-2018 16:20 2847059

Цитата:

Цитата vk_k14m@vk
Что конкретно? »

Как это выглядит у меня при попытке сэмулировать Ваши условия:
Скрытый текст

Отдельный процесс Проводника (7232), из которого ярлыком запускается наш скрипт WSH (5420). Скрипт посредством Wbem обращается к службе провайдера WMI (9304), которая и организует запуск процесса Multi Theft Auto.exe (в роли которого выступает переименованный исполняемый файл Блокнота, 7360), а затем, спустя пять секунд, процесса bdcam.exe (8564; в предоставленном Вам варианте скрипта — будет загрузчик Loader.exe, который сам запускает bdcam.exe), каковой из-под себя запускает процесс bdcam64.bin (6760). Вот так у меня это выглядит в момент, когда «всё запущено».

Когда мы «ручками» закрываем Multi Theft Auto.exe, скрипт реагирует на завершение этого процесса, ищет по имени и закрывает процесс bdcam64.bin, напрямую обращается к родительскому процессу bdcam64.bin'а по ProcessID — процессу bdcam.exe и закрывает и его. После этого скрипт завершает свою работу.

Цитата:

Цитата alpap
суперпиратский Bandicam »

Ну, я тоже поначалу удивился, почему у автора ярлык указывает на некий Loader.exe, тогда как у меня — на bdcam.exe ;).

vk_k14m@vk 22-12-2018 01:11 2847479

Пришлось ставить Portable версию приложения. Получилось частично повторить твой скриншот.
Цитата:

Цитата Iska
Как это выглядит у меня при попытке сэмулировать Ваши условия»

Но увы, только на половину:
Скрытый текст


После закрытия игры бандикам продолжает работать дальше. Видимо этот wscript.exe просто не умеет работать с приложениями, которые запускаются не напрямую, а через лоадер...

Может есть более просто способ провернуть тоже самое?

Iska 22-12-2018 07:26 2847492

Цитата:

Цитата vk_k14m@vk
Решил я значит скачать другой банбикам. Скачал один, тот тоже через лоадер запускается. Удалил, скачал второй, там вот такой установщик … Третья раздача - лоадер. … Четвертая раздача … Пятая раздача. Читаю инструкцию по лечению… »

vk_k14m@vk, у нас есть пункт в Правилах…, под номером 3.18. Впрочем, Вы о нём уже знаете из соседней темы.

Цитата:

Цитата vk_k14m@vk
Видимо этот wscript.exe просто не умеет работать с приложениями, которые запускаются не напрямую, а через лоадер... »

Могу сказать три вещи: а) «этот» (или какой-нибудь другой) wscript.exe здесь совершенно не при чём, б) у меня скрипт работает с приложением, установленным с официального сайта, б) у меня при подобном закрытии процесса (Terminate Process) файл видео портится.

vk_k14m@vk 22-12-2018 09:36 2847503

Цитата:

Цитата Iska
б) у меня скрипт работает с приложением, установленным с официального сайта »

Так у меня тоже игра установлена с официального сайта. Но работает она не так как твой "переименованный" блокнот. А именно, блокнот отображается в списке процессов а игра нет. А если не отображается именно игра, значит и этот ваш wscript.exe как то не так ее запускает.

Цитата:

Цитата Iska
б) у меня при подобном закрытии процесса (Terminate Process) файл видео портится. »

Так может пиратка все же луче лицензии?

Iska 22-12-2018 10:05 2847506

Цитата:

Цитата vk_k14m@vk
Так у меня тоже игра установлена с официального сайта. »

А я не про игру. Я про Bandicam.

Цитата:

Цитата vk_k14m@vk
А именно, блокнот отображается в списке процессов а игра нет. »

А это:

тогда что (скриншот, опять-таки предоставленный Вами)?

Цитата:

Цитата vk_k14m@vk
Так может пиратка все же луче лицензии? »

vk_k14m@vk, терпение у модераторов рано или поздно может закончиться. Давайте не будем его испытывать.

vk_k14m@vk 22-12-2018 23:09 2847653

Цитата:

Цитата Iska
А это:
тогда что (скриншот, опять-таки предоставленный Вами)? »

Тут нужно обратить внимание на расстояние от края окна.
Скрытый текст


Эти приложения запущены разными способами. Ты же писал:
Цитата:

Цитата Iska
Отдельный процесс Проводника (7232), из которого ярлыком запускается наш скрипт WSH (5420). Скрипт посредством Wbem обращается к службе провайдера WMI (9304), которая и организует запуск процесса Multi Theft Auto.exe (в роли которого выступает переименованный исполняемый файл Блокнота, 7360), а затем, спустя пять секунд, процесса bdcam.exe (8564; в предоставленном Вам варианте скрипта — будет загрузчик Loader.exe, который сам запускает bdcam.exe), каковой из-под себя запускает процесс bdcam64.bin (6760). Вот так у меня это выглядит в момент, когда «всё запущено».

Когда мы «ручками» закрываем Multi Theft Auto.exe, скрипт реагирует на завершение этого процесса, ищет по имени и закрывает процесс bdcam64.bin, напрямую обращается к родительскому процессу bdcam64.bin'а по ProcessID — процессу bdcam.exe и закрывает и его. После этого скрипт завершает свою работу. »

Это значит что оба приложения должны быть запущены под WmiPrvSE.exe? Но скрипт запускает так только Бандикам. А игра как запускалась отдельно, так и запускается. Не важно, запускаю я ее через скрипт или ручками.
Скрытый текст


А раз уж игра висит отдельно, я сделал вывод, что скрипт не отлавливает момент ее закрытия, а по этому и Бандикам не закрывает. Я не прав?

Если прав то я все правильно написал
Цитата:

Цитата vk_k14m@vk
Видимо этот wscript.exe просто не умеет работать с приложениями, которые запускаются не напрямую, а через лоадер... »



Время: 00:37.

Время: 00:37.
© OSzone.net 2001-