CMD/BAT - Автоматизация запущенного процесса

Ответить
 • Просмотры: 1
Аватара пользователя
DJ Mogarych

Re: CMD/BAT - Автоматизация запущенного процесса

Сообщение DJ Mogarych »

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



Потестируйте с запущенной и незапущенной программой:



Код:

Код: Выделить всё

if (!(get-process sefwmail -ErrorAction SilentlyContinue)) {
"Не работает"
}
else {
"Работает"
}
Аватара пользователя
Iska

Re: CMD/BAT - Автоматизация запущенного процесса

Сообщение Iska »

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



Наподобие (на WSH):



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

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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







Уже ж было такое недавно.
Аватара пользователя
alpap

Re: CMD/BAT - Автоматизация запущенного процесса

Сообщение alpap »

Цитата АннаКузнецова:



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




все так и должно быть

вот теперь отключите (закройте окно крестиком) процесс и подождите более 10 сек, ну информацию о исчезновении процесса сразу покажет как и запись в лог

иначе скорее всего низкая версия PowerShell, надо обновить
Аватара пользователя
YuS_2

Re: CMD/BAT - Автоматизация запущенного процесса

Сообщение YuS_2 »

Цитата Iska:



Уже ж было такое недавно.
CMD/BAT - Автоматизация запущенного процесса




Навеяло: Было-было-было... но прошло... Изображение

Вот
CMD/BAT - [решено] Батник отслеживающий и убивающий процесс
, обратное действие...






Цитата АннаКузнецова:



Хочется чтобы скрипт, если программа не запущена- писал в лог сообщение о недоступности или в конце концов просто 0 выводил, а затем эту программу бы запускал.

Путь до программы: E:\Program Files (x86)\POST\Sefmail\

Прошу помощи в автоматизации моего процесса
CMD/BAT - Автоматизация запущенного процесса




Если адаптировать скрипт под задачу, то как-то так:



Слежение за выключением процесса script.ps1

[spoiler]Код:
[/spoiler]

Код: Выделить всё

# Не работает в версиях новее 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









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

Re: CMD/BAT - Автоматизация запущенного процесса

Сообщение greg zakharov »

Цитата АннаКузнецова:



человеские руки считаю более очевидным



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

Re: CMD/BAT - Автоматизация запущенного процесса

Сообщение greg zakharov »

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



$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 "" ""
Ответить

Вернуться в «Скриптовые языки администрирования Windows»