В дополнение Полезный ответ Акселя Андерсона :
Register-EngineEvent
подписывается на событие в текущем сеансе , тогда как команды, запущенные с Start-Job
, выполняются в фоновом задании, которое является дочерним процессом , который определение является отдельной сессией.
Аналогично, любые события, которые вы вызываете с помощью New-Event
, видны только в том же сеансе , поэтому вызывающий сеанс никогда не видел события.
Перемещая всю логику событий в фоновое задание, как в ответе Акселя, события обрабатываются в фоновом задании , но есть важное ограничение - которое может иметь или не иметь важно для вас:
Вы не сможете захватить вывод из обработчика событий: пока вы можете сделать вывод на печать на консоль , используя Write-Host
, этот вывод не может быть захвачен для программной обработки . Кроме того, такой Write-Host
вывод не может быть подавлен .
Напротив, выходные данные отправляются в поток успешного вывода непосредственно из фонового задания - например, "IN JOB SCRIPT"
is, неявно (подразумеваемое использование Write-Output
) - можно получить через Receive-Job
, который извлекает выходные данные из фоновых заданий.
Поэтому, возможно, в вашем случае достаточно, что вообще не требует использования событий:
# Code to execute in the background, defined a script block.
$jobScript = {
while ($true) {
Start-Sleep -Seconds 1
"JOB OUTPUT #$(($i++))"
}
}
# Launch the background job and save the job object in variable $job.
$job = Start-Job -Name Job -ScriptBlock $jobScript;
# Periodically relay the background job's output.
while ($true) {
Start-Sleep -Seconds 1
"IN LOOP, about to get latest job output:"
$latestOutput = Receive-Job $job
"latest output: $latestOutput"
}
Для объяснения конструкции $(($i++))
см. этот ответ .
Выше приведено следующее:
IN LOOP, about to get latest job output:
latest output:
IN LOOP, about to get latest job output:
latest output: JOB OUTPUT #0
IN LOOP, about to get latest job output:
latest output: JOB OUTPUT #1
IN LOOP, about to get latest job output:
latest output: JOB OUTPUT #2
IN LOOP, about to get latest job output:
latest output: JOB OUTPUT #3
IN LOOP, about to get latest job output:
latest output: JOB OUTPUT #4
IN LOOP, about to get latest job output:
latest output: JOB OUTPUT #5
IN LOOP, about to get latest job output:
...