Цитата 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
Изначально, процесс должен быть запущен. При закрытии процесса, в консоль будет выдаваться соответствующее сообщение и запуск необходимого процесса, а также при закрытии других процессов, тоже будут сообщения, но без запусков...