У меня возникли проблемы с получением PowerShell, чтобы вызвать функцию обратного вызова в комплект поставки:Почему PowerShell.BeginInvoke не вызывает обратный вызов?
$rs = [RunspaceFactory]::CreateRunspace()
$rs.Open()
$ps = [PowerShell]::Create()
$ps.Runspace = $rs
$ps.AddScript({
Get-Service
}) | Out-Null
$psdcInputs = New-Object Management.Automation.PSDataCollection[String]
$psdcInputs.Complete()
$psdcOutputs = New-Object Management.Automation.PSDataCollection[Object]
$psis = New-Object Management.Automation.PSInvocationSettings
$asyncCallback = {
Param (
[IAsyncResult]$result
)
Write-EventLog -LogName Application -Source Testing -EntryType Information `
-Category 0 -EventId 1234 -Message "Test."
$result.AsyncState.EndInvoke($result)
}
$aResult = $ps.BeginInvoke($psdcInputs, $psdcOutputs, $psis, $asyncCallback, $ps)
В scriptblock
работает и $psdcOutputs
содержит набор ServiceController
объектов, как и ожидалось. Но код в $asyncCallback
scriptblock
не запускается, и событие не записывается в журнал событий. Я не вижу, что я делаю неправильно. Вы можете помочь, пожалуйста?
Примечание: Я не беспокоюсь о записи в журнал событий - есть другие вещи, которые я хочу здесь сделать, - но мне нужно было абстрагировать это из исходного кода, чтобы сделать его разумным.
По какой-то причине '$ ps.HadErrors' установлен в' True' после вызова 'BeginInvoked'. –
Вы правы! Даже если скриптовый блок пуст, он имеет значение True. Вы сталкивались с этим раньше? – user2871239
Я запустил эквивалентный C#, и он не устанавливает HadErrors в true и обратный вызов действительно запускается. – user2871239