2014-09-05 32 views
1

我有一个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

回答

3

发生什么事是ScriptBlock正在转换成一个委托(EventHandler<SvnListEventArgs>),它返回void,所以Write-Output没有任何地方发送输出。这是一个有点像这样:

[Action]$action = { Write-Host "Test"; Write-Output "Test" } 
$action.Invoke() 

由于Action不返回任何内容有写,输出的结果去任何地方。现在,如果委托返回一个对象,将工作:

[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

谢谢!你知道我是否可以获得对当前管道的参考,以强制推动其中的东西? – 2014-09-09 23:32:17

1

你可以尝试使用:

$ PSCmdlet.WriteObject(“这就是:$ê “)