2014-09-05 48 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(「這就是:$ê 「)