我在PowerShell函数中有以下代码:
$client.List($target, {
param ($sender, $e)
Write-Host "Here it is: $e"
Write-Output $e
})
(客户端是SharpSvn.SvnClient
,$target
是某个存储库URL)
当我运行它(只是在控制台中调用我的函数)时,我得到了一个"列表:SharpSvn.SvnListEventArgs" ,用于存储库中的每个项目,所以我知道回调已经执行。
但实际项目不会输入输出(管道或控制台)。
如果我将Write-Output
放在回调之外,则会正确处理该项,因此我认为它存在于回调块中。
如何正确设置回调阻止流程Write-Output
?
答案 0 :(得分:4)
正在发生的事情是ScriptBlock被转换为委托(EventHandler<SvnListEventArgs>
),它返回void,因此Write-Output没有任何地方可以发送输出。它有点像这样:
[Action]$action = { Write-Host "Test"; Write-Output "Test" }
$action.Invoke()
由于Action
没有返回任何内容,因此Write-Output的结果无处可去。现在,如果委托返回一个对象,它将起作用:
[Func[object]]$func = { Write-Host "Test"; Write-Output "Test"; Write-Output "Test2" }
$func.Invoke()
我猜测写输出工作的方式是它将输出发送到某处,如果可能的话,当执行退出脚本块时,将导致返回所有输出。它没有引用“当前管道”或“当前正在执行的函数”,因此无法直接在那里写入。
我认为捕获输出的方法是做这样的事情:
$list = new-object System.Collections.Generic.List[Object]
$client.List($target, {
param ($sender, $e)
Write-Host "Here it is: $e"
$list.Add($e)
})
Write-Output $list
答案 1 :(得分:1)
您可以尝试使用:
$ PSCmdlet.WriteObject(&#34;这里是:$ e&#34;)