And*_*kin 3 powershell powershell-2.0
我在 PowerShell 函数中有以下代码:
$client.List($target, {
param ($sender, $e)
Write-Host "Here it is: $e"
Write-Output $e
})
Run Code Online (Sandbox Code Playgroud)
(客户端是SharpSvn.SvnClient,并且$target是某个存储库 URL)
当我运行它时(只需在控制台中调用我的函数),我会得到存储库中每个项目的“这里是:SharpSvn.SvnListEventArgs”列表,因此我知道回调已执行。
但是,实际项目不会放入输出(管道或控制台)中。
如果我将其放在Write-Output回调之外,则该项目将被正确处理,因此我假设它在回调块中存在某些内容。
如何Write-Output正确地进行回调块处理?
发生的情况是 ScriptBlock 被转换为EventHandler<SvnListEventArgs>返回 void 的委托 ( ),因此 Write-Output 没有任何地方可以发送输出。有点像这样:
[Action]$action = { Write-Host "Test"; Write-Output "Test" }
$action.Invoke()
Run Code Online (Sandbox Code Playgroud)
由于Action不返回任何内容,因此 Write-Output 的结果无处可去。现在,如果委托返回一个对象,它将起作用:
[Func[object]]$func = { Write-Host "Test"; Write-Output "Test"; Write-Output "Test2" }
$func.Invoke()
Run Code Online (Sandbox Code Playgroud)
我猜测 Write-Output 在幕后工作的方式是将输出发送到某处,如果可能的话,当执行退出脚本块时,这将导致所有输出被返回。它没有引用“当前管道”或“当前正在执行的函数”,因此它不能直接写入其中。
我认为捕获输出的方法是执行以下操作:
$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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1213 次 |
| 最近记录: |