Write-Output在回调中不起作用

时间:2014-09-05 01:00:50

标签: powershell powershell-v2.0

我在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

2 个答案:

答案 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;)