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

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

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

Забанен


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

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


Здравствуйте, уважаемые форумчане. Хочу попросить Вас о помощи в написании скрипта
Попробую описать подробно задачку:

На компьютере, должен постоянно быть запущен процесс sefmail.exe, но по причине человеческих рук, либо сверхестественных сил, этот процесс постоянно закрывается. (человеские руки считаю более очевидным )
Хочется чтобы скрипт, если программа не запущена- писал в лог сообщение о недоступности или в конце концов просто 0 выводил, а затем эту программу бы запускал.
Путь до программы: E:\Program Files (x86)\POST\Sefmail\

Прошу помощи в автоматизации моего процесса

Отправлено: 12:41, 10-06-2021

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Вообще-то, проверяет.

Потестируйте с запущенной и незапущенной программой:
Код: Выделить весь код
if (!(get-process sefwmail -ErrorAction SilentlyContinue)) {
"Не работает"
}
else {
"Работает"
}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 20:57, 10-06-2021 | #11



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

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


Ветеран


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

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


Коллеги, да не надо ничего проверять. Надо запускать процесс из самого пакетного файла/скрипта с ожиданием завершения.

Наподобие (на WSH):
Скрытый текст
Код: Выделить весь код
Option Explicit

With WScript.CreateObject("WScript.Shell")
	Do
		' "E:\Program Files (x86)\POST\Sefmail\sefmail.exe"
		.Run "c:\windows\system32\notepad.exe", 1, True
		
		With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Мои проекты\0344\log.txt", 8, True)
			.WriteLine Now() & vbTab & "сообщение о недоступности"
			.Close
		End With
	Loop
End With

WScript.Quit 0

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

Отправлено: 22:03, 10-06-2021 | #12


Ветеран


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

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


Цитата АннаКузнецова:
Но по моему ничего не получилось »
все так и должно быть
вот теперь отключите (закройте окно крестиком) процесс и подождите более 10 сек, ну информацию о исчезновении процесса сразу покажет как и запись в лог
иначе скорее всего низкая версия PowerShell, надо обновить

Отправлено: 05:02, 11-06-2021 | #13


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
Уже ж было такое недавно. »
Навеяло: Было-было-было... но прошло...
Вот тут было, обратное действие...


Цитата АннаКузнецова:
Хочется чтобы скрипт, если программа не запущена- писал в лог сообщение о недоступности или в конце концов просто 0 выводил, а затем эту программу бы запускал.
Путь до программы: E:\Program Files (x86)\POST\Sefmail\
Прошу помощи в автоматизации моего процесса »
Если адаптировать скрипт под задачу, то как-то так:
Слежение за выключением процесса script.ps1
Код: Выделить весь код
# Не работает в версиях новее PS v5.1, https://github.com/PowerShell/PowerShell/issues/13999
[cmdletbinding()]
param(
	# Процесс для слежения можно задать в командной строке: 
	# .\script.ps1 'notepad.exe','win32calc.exe'
	# или здесь:
	[string[]]$process = 'Sefmail.exe'
add-type -assembly system.windows.forms
#$control = {ps $process -ea 0}

function enable-processdeletedevent {
	$query = new-object system.management.wqleventquery "__instancedeletionevent",
	(new-object timespan 0,0,1), "targetinstance isa 'win32_process'"
	$processwatcher = new-object system.management.managementeventwatcher $query
	$argsevents = @{
		InputObject = $processwatcher
		EventName = "eventarrived"
		Action = {
			[void] (new-event -sourceid "processdeleted" -sender $sender `
			-eventarguments $eventargs.newevent.targetinstance)
		}
	}
	$script:job = register-objectevent  @argsevents
}
$id = "processdeleted"
enable-processdeletedevent

$form = new-object windows.forms.form
$form.autosizemode = [windows.forms.autosizemode]::growandshrink
$form.formborderstyle = [windows.forms.formborderstyle]::fixedtoolwindow
$form.windowstate = [windows.forms.formwindowstate]::maximized
$form.controlbox = $true
$form.sizegripstyle = [windows.forms.sizegripstyle]::hide
$form.text = 'Продолжить слежение?'
$form.showintaskbar = $false
$form.topmost = $true
$form.startposition = 'CenterScreen'
$btnyes = new-object windows.forms.button
$btnyes.text = 'Да'
$btnyes.location = new-object system.drawing.point(3,10)
$btnyes.dialogresult = [windows.forms.dialogresult]::ok
$form.controls.add($btnyes)
$btnno = new-object windows.forms.button
$btnno.text = 'Нет'
$btnno.location = new-object system.drawing.point(110,10)
$btnno.dialogresult = [windows.forms.dialogresult]::no
$form.controls.add($btnno)

do{
	wait-event $id|out-null
	#$p = &$control
	if($process -contains ($a = (get-event $id).sourceargs.name)){
		write-host Процесс $a был выключен $(get-date)
		#start $a
		start "E:\Program Files (x86)\POST\Sefmail\Sefmail.exe"
		remove-event $id
		$res = $form.showdialog()
	} else {
		write-host Это процесс не из списка для слежения `($a`)
		remove-event $id
	}
} while ($res -ne 'No')
if(get-event $id -ea 0){get-event $id|remove-event}
get-eventsubscriber -sub $job.id|unregister-event
get-job -id $job.id|remove-job -force


Изначально, процесс должен быть запущен. При закрытии процесса, в консоль будет выдаваться соответствующее сообщение и запуск необходимого процесса, а также при закрытии других процессов, тоже будут сообщения, но без запусков...

-------
scio me nihil scire. Ѫ

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

Отправлено: 13:45, 12-06-2021 | #14


Забанен


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

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


Цитата АннаКузнецова:
человеские руки считаю более очевидным
Так для чего тогда строчить сценарий, когда можно обойтись политиками доступа? Другое дело, если процесс падает в виду, скажем, некой внутренней логической ошибки.

Отправлено: 23:16, 12-06-2021 | #15


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


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

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


Привет, можно сделать таким образом.

$Date = Get-Date -Format "yyyy-mm-dd HH:mm:ss"
$filename = $args[0]
$process = @()
$process += Get-Process Sefmail -ea SilentlyContinue
if ($process[0]){
echo "$date 1" > $filename
}
else{
echo "$date 0" > $filename
}

Только не забудте сделать в планировщике аргумент -executionpolicy unrestricted -file "<Каталог со скриптом>" "<Каталог с логами>"

Отправлено: 08:32, 29-06-2021 | #16



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Проверки запущенного процесса. Svnkill Скриптовые языки администрирования Windows 8 19-05-2021 14:42
CMD/BAT - Проверка занимаемой памяти запущенного процесса KaDirZhan Скриптовые языки администрирования Windows 7 29-04-2021 01:03
Проверка запущенного процесса Anarasius AutoIt 2 25-06-2014 11:39
.NET - Получение PID процесса, запущенного из программы Delirium Программирование и базы данных 2 07-12-2009 02:17
Java - Отслеживание состояния запущенного процесса EvgeniyQQQ Программирование и базы данных 15 02-10-2007 13:20




 
Переход