Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - Батник на выключение батника при включении определенных программах

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


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

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


Изменения
Автор: mr.djdig@vk
Дата: 04-04-2022
Доброго времени, Господа. Есть проблема, не хватает серого вещества у меня на ее решение.

В общем, есть батник запускаемый под вин10 через планировщик задач при запуске компа, задача состоит в том, чтобы написать батник, который вырубал бы его при включении определенных программ из списка.

Как я себе это представляю, оба батника запускаются через планировщик, один рабочий самый первый, второй просто постоянно находится в фоне и ничего не делает основное время, в нем внутри находится список программ-триггеров, второй батник закрывает полностью первый, и вот как это реализовать знаний моих не хватает.
Основной список программ триггеров скорее всего, steam, chrome, gamecenter, wgc, uplay. Сейчас все происходит посредством запуска второго батника на рабочем столе с taskkill /IM FSR.bat /F. Автоматический запуск первого батника реализован через тот же планировщик задач при простое ПК.

На данный момент я додумал только вот такое. Но что-то я не правильно сделал... При включенном браузере например или стиме, пейнт не закрывается
Код: Выделить весь код
@Echo
SetLocal EnableExtensions
:KOK
Set ProcessName1=steam.exe
Set ProcessName2=chrome.exe
Set ProcessName3=wgc.exe
Set ProcessName4=gamecenter.exe

TaskList /FI "ImageName EQ %ProcessName1%" | Find /I "steam.exe"
TaskList /FI "ImageName EQ %ProcessName2%" | Find /I "chrome.exe"
TaskList /FI "ImageName EQ %ProcessName3%" | Find /I "wgc.exe"
TaskList /FI "ImageName EQ %ProcessName4%" | Find /I "gamecenter.exe"

If %ErrorLevel% EQU 1 goto KOK
If %ErrorLevel% EQU 1 taskkill /IM mspaint.exe /F
pause

Отправлено: 00:47, 04-04-2022

 

Ветеран


Contributor


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

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


mr.djdig@vk, Я бы предложил другой подход:
Запускаем "один рабочий самый первый батник" через vbs-скрипт.
В том же скрипте задан список тех процессов, при появлении любого из них убиваем "один рабочий самый первый батник"
При этом, естественно vbs-скрипт завершается.
Если до запуска скрипта процессы из списка были запущены, батник убит не будет, батник убивается только при появлении процессов после запуска скрипта.
Код: Выделить весь код
Option Explicit
Dim Bat, MgmProc, WMIcmd, WMIout, ProcessID, SQL, Processes, Process

Bat = "CMD /C ""Z:\Box_In\batfile.bat"""
MgmProc = Array("notepad.exe", "calc.exe", "mspaint.exe")

Set WMIcmd = GetObject("WinMgmts:\\.\Root\CIMV2:Win32_Process")
WMIout = WMIcmd.Create("CMD /C ""Z:\Box_In\batfile.bat""", Null, Null, ProcessID)

Call ProcEvent(MgmProc)

SQL = "Select *From Win32_Process Where processid=" + CStr(ProcessID)
Set Processes = GetObject("winMgmts:").ExecQuery(SQL)

For Each Process In Processes
    Process.Terminate
Next

Sub ProcEvent(MgmProc)
    Dim MgmWhere, i, i1, SQL
    Dim objEventSource, objEvent
    
    i1 = LBound(MgmProc)
    SQL = "TargetInstance.Name='" + MgmProc(i1) + "'"
    
    For i = i1 + 1 To UBound(MgmProc)
        SQL = SQL + "OR TargetInstance.Name='" + MgmProc(i) + "'"
    Next
    
    SQL = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_Process' AND (" + SQL + ")"
    Set objEventSource = GetObject("WinMgmts:\\.\Root\CIMV2").ExecNotificationQuery(SQL)
    Set objEvent = objEventSource.NextEvent
End Sub
Если "один рабочий самый первый батник" необходимо запустить в скрытом окне
Код: Выделить весь код
Option Explicit
Dim Bat, WMIconfig, MgmProc, WMIcmd, WMIout, ProcessID, SQL, Processes, Process

Bat = "CMD /C ""Z:\Box_In\batfile.bat"""
MgmProc = Array("notepad.exe", "calc.exe", "mspaint.exe")

Set WMIcmd = GetObject("WinMgmts:\\.\Root\CIMV2:Win32_Process")
Set WMIconfig = GetObject("WinMgmts:\\.\Root\CIMV2").Get("Win32_ProcessStartup").SpawnInstance_
WMIconfig.ShowWindow = 12

WMIout = WMIcmd.Create("CMD /C ""Z:\Box_In\batfile.bat""", Null, WMIconfig, ProcessID)

Call ProcEvent(MgmProc)

SQL = "Select *From Win32_Process Where processid=" + CStr(ProcessID)
Set Processes = GetObject("winMgmts:").ExecQuery(SQL)

For Each Process In Processes
    Process.Terminate
Next

Sub ProcEvent(MgmProc)
    Dim MgmWhere, i, i1, SQL
    Dim objEventSource, objEvent
    
    i1 = LBound(MgmProc)
    SQL = "TargetInstance.Name='" + MgmProc(i1) + "'"
    
    For i = i1 + 1 To UBound(MgmProc)
        SQL = SQL + "OR TargetInstance.Name='" + MgmProc(i) + "'"
    Next
    
    SQL = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_Process' AND (" + SQL + ")"
    Set objEventSource = GetObject("WinMgmts:\\.\Root\CIMV2").ExecNotificationQuery(SQL)
    Set objEvent = objEventSource.NextEvent
End Sub

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


Последний раз редактировалось megaloman, 04-04-2022 в 22:09.

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

Отправлено: 18:03, 04-04-2022 | #2



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

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


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


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

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


Добрый вечер/день, не было возможности зайти в тему посмотреть ответы. В первую очередь спасибо за них) Попробую вариант с запуском через vbs.

Цитата megaloman:
Если до запуска скрипта процессы из списка были запущены, батник убит не будет »
Вот на счет этого проблемка, если полностью описывать ситуацию, причина по которой запуск батника происходит именно через планировщик и при старте системы, батник при таком раскладе запускается от системы с повышенным приоритетом и без вида самой консоли. В первоначальном коде msplain.exe использовалась мной как заглушка вместо этого самого батника тк он использует exe файл как основу и на ней я тестировал правильно ли работает мой скрипт.

Сама суть задачи этого батника и причины, домашний ПК используется в вычислительных операциях, дабы домочадцы в виде малых лет детей и не особо разбирающихся взрослых ничего не понатыкали и/или случайно не выключили, используется так же планировщик который запустит все это дело. А вот в моменты когда на ПК выполняются какие либо ресурсозатратные задачи по типу игрушек, работы итд, нужен второй батник для завершения первого батника, как-то так. Попробую реализовать это через vbs который так же будет запускаться при простое, возможно? Сам особо в vbs не знаю, ранее использовалось все так, что в винде было два пользователя и когда нужно было, заходили под второй учеткой и там все делали, а уже в первой просто первый батник стоял на автозагрузке через ярлык, но сейчас это стало не очень удобно тк нужна автоматизация и автономность в моменты когда я не дома.

Отправлено: 18:08, 06-04-2022 | #3


Ветеран


Contributor


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

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


mr.djdig@vk, Вам не надо запускать программу батником, если он состоит только из одной строки Start. Напрямую VBS. Но это не решит задачу повторного запуска этого процесса.

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


Отправлено: 20:02, 06-04-2022 | #4


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


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

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


я делал так:
tasklist | find "Far.exe"
if errorlevel 1 goto Start_1
if errorlevel 0 goto Goto OS
:Start_1
выполняем что хотели...
Goto OS
:OS
exit
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:33, 08-04-2022 | #5


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


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

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


Так, в общем то, я вроде как с помощью костылей небольших разобрался как это сделать! Всем спасибо за помощь!
Код: Выделить весь код
@echo off
:1
tasklist | find "steam.exe"
IF %ERRORLEVEL% neq 0 goto 2
If %ERRORLEVEL% neq 1 taskkill /IM mspaint.exe /F
:2
tasklist | find "GameCenter.exe"
IF %ERRORLEVEL% neq 0 goto 3
If %ERRORLEVEL% neq 1 taskkill /IM mspaint.exe /F
:3
tasklist | find "wgc.exe"
IF %ERRORLEVEL% neq 0 goto 4
If %ERRORLEVEL% neq 1 taskkill /IM mspaint.exe /F
:4
tasklist | find "chrome.exe"
IF %ERRORLEVEL% neq 0 goto 1
If %ERRORLEVEL% neq 1 taskkill /IM mspaint.exe /F
goto 1
pause

Отправлено: 16:47, 12-04-2022 | #6


Ветеран


Contributor


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

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


mr.djdig@vk, Показанный Вами батник - не очень хорошая идея, он будет грузить процессор. И где повторный запуск главного процесса?
Цитата megaloman:
Вам не надо запускать программу батником »
Вместо Вашей задачи я использовал для отладки mspaint.exe, привёл пример её запуска с параметрами - именем файла, у Вас его нет. Вы для отладки можете указать свой файл. В боевом режиме - реальную программу.
Как работает:
Вы запускаете скрипт планировщиком.
1. Если у Вас не запущена основная программа (сейчас - mspaint.exe) и все программы из списка, запускаем основную программу.
2. Скрипт ждет появления одной из программ из списка
3. Как только такая программа появляется - основная программа убивается.
4. Скрипт в цикле с паузой (не надо излишне грузить процессор) опрашивает начиная с п.1 и, пока хоть одна программа из списка присутствует, основная программа запущена не будет.
Код: Выделить весь код
Option Explicit

Dim PgmMain: PgmMain = "mspaint.exe"
Dim PgmStart: PgmStart = """mspaint.exe"" ""D:\CMD_Forum\Box_In\Лаб-4.png"""

Dim PauseMsec: PauseMsec = 15000

Dim MgmProc
MgmProc = Array("steam.exe", "GameCenter.exe", "wgc.exe", "chrome.exe")

Dim WMIcmd, WMIout, i, SQuery, Processes, Process
Dim WSH, Ret
Set WSH = CreateObject("WScript.Shell")

SQuery = "Select *From Win32_Process Where Name=""" + PgmMain + """"
For Each Ret In MgmProc
    SQuery = SQuery + " or Name=""" + Ret + """"
Next

Do
    Set Processes = GetObject("winMgmts:").ExecQuery(SQuery)
    If Processes.Count = 0 Then
'''''''''''''''''''''''''''''''''''        Ret = WSH.Run(PgmStart, 1, False)
        Ret = WSH.Run(PgmStart, 0, False)
        WScript.Sleep (4000)
        Call ProcEvent(MgmProc)
        Do
            Set Processes = GetObject("winMgmts:").ExecQuery("Select *From Win32_Process Where Name=""" + PgmMain + """")
            For Each Process In Processes
                Process.Terminate
            Next
        Loop While Processes.Count > 0
    End If
    WScript.Sleep (PauseMsec)
Loop

Sub ProcEvent(MgmProc)
    Dim MgmWhere, i, i1, SQL
    Dim objEventSource, objEvent
    
    i1 = LBound(MgmProc)
    SQL = "TargetInstance.Name='" + MgmProc(i1) + "'"
    
    For i = i1 + 1 To UBound(MgmProc)
        SQL = SQL + "OR TargetInstance.Name='" + MgmProc(i) + "'"
    Next
    
    SQL = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_Process' AND (" + SQL + ")"
    Set objEventSource = GetObject("WinMgmts:\\.\Root\CIMV2").ExecNotificationQuery(SQL)
    Set objEvent = objEventSource.NextEvent
End Sub
Программа запускается Ret = WSH.Run(PgmStart, 0, False). 0 отвечает за скрытый режим. Если для отладки надо видеть запускаемую программу, поставьте 1.
В скрипте работает бесконечный цикл, сам он не завершится. Если зачем-то его надо завершить - в диспетчере задач убейте процесс wscript.exe

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


Отправлено: 10:14, 13-04-2022 | #7



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интернет - Программа для поиска в интернете определенных файлов на определенных ресурсов tumanovalex Программное обеспечение Windows 4 15-10-2018 19:27
Программа для поиска в интернете определенных файлов на определенных ресурсов tumanovalex Программное обеспечение Linux и FreeBSD 0 15-09-2018 10:00
CMD/BAT - Батник на выключение компьютеров по сети. Hrust2010 Скриптовые языки администрирования Windows 38 13-10-2016 14:18
CMD/BAT - батник, который чистит корзину при включении компьютера sheepang Скриптовые языки администрирования Windows 4 22-07-2016 11:51
CMD/BAT - [решено] Батник на выключение с автоотменой в заданный промежуток времени Cashmar Скриптовые языки администрирования Windows 2 16-05-2012 17:35




 
Переход