Я хочу перехватить сценарий PowerShell по окончании, чтобы я мог выполнить некоторую окончательную обработку до его остановки.Register-EngineEvent -SourceIdentifier PowerShell.Exiting
, кажется, способ сделать это, но он не работает ни для чего, кроме тривиальных приложений.
Работают простые примеры.Например:
Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {write-host "This is trivial"}
напечатает «Это тривиально», когда сценарий завершится.Однако любой блок действий, которому нужны данные, переданные ему, не получает эти данные.Например:
Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action {write-host ">> " $($event.MessageData)} -MessageData "This doesn't work"
будет печатать только две ведущие угловые скобки, а не строку «Это не работает».
Обратите внимание, что я вызываю сценарий из командной строки(cmd.exe
) и именно там Write-Host
в конечном итоге печатает после выхода из PowerShell.
Кроме того, за исключением автоматических переменных $Event
, все остальные, такие как $Sender
,$Args
, $EventArgs
и т. Д. Не заселены.Также некоторые свойства $Event
не заполняются.Например, $Event.ComputerName
ничего не печатает, а $Event.TimeGenerated
печатает текущую дату и время.У моего компьютера есть имя.
Я включил крошечный пример программы, которая демонстрирует, что я делаю это неправильно или что есть некоторые ограничения в том, что можно сделать с Register-EngineEvent
, возможно, это даже ошибка, которую япредположим.
Я потратил довольно много времени на поиск веб-сайтов, но я не нашел примеров, когда они передают данные в блок действий для Register-EngineEvent
.
sleep 1
write-host "Starting"
sleep 1
write-host "Finished"
Register-EngineEvent -SourceIdentifier PowerShell.Exiting -MessageData "This doesn't work" -Action {write-host ">> " $($event.MessageData)}
sleep 2
Я ожидал бы, что этот маленький скрипт выведет «Starting», затем 1 секунду позже «Finished», а затем, еще через 2 секунды, обработчик событий выведет «>> Это не работает».Я получаю первые два сообщения, но все, что я получаю от обработчика, это «>>».
Я работаю в Windows 10 с Powershell V5.Я не запускаю его в ISE.Я использую командную строку powershell -file .\try6.ps1
, где try6.ps1
- это скрипт, который я включил выше.
Если кто-нибудь может подсказать, что я делаю неправильно, или альтернативные способы сделать это, было бы замечательно, но даже если этопросто это известная ошибка или что я неправильно понял, что такое PowerShell.exiting
или Register-EngineEvent
, и они не могут быть использованы так, как я пытаюсь, это также будет очень полезно.