Powershell:Start-Job中的递归函数和多个参数

时间:2014-09-10 03:08:10

标签: multithreading powershell recursion parameters

我一直在靠墙撞墙几天,试图让Start-Job和后台工作无效。

我已经尝试过ScriptBlock和ScriptFile,但似乎都没有做我想要的,或者我似乎无法正确理解语法。

我有许多递归函数,需要将脚本拆分为并行处理大量数据集的许多块。

无论我如何安排Start-Job调用,似乎没有任何工作,并且递归函数似乎使所有内容都变得两倍。

任何人都可以给我一个Start-Job调用递归函数并有多个参数的工作示例,或者指向某个存在的地方吗?

任何帮助表示赞赏

1 个答案:

答案 0 :(得分:1)

这对我有用:

$sb = {param($path, $currentDepth, $maxDepth) function EnumFiles($dir,$currentDepth,$maxDepth) { if ($currentDepth -gt $maxDepth) { return }; Get-ChildItem $dir -File; Get-ChildItem $dir -Dir | Foreach {EnumFiles $_.FullName ($currentDepth+1) $maxDepth}}; EnumFiles $path $currentDepth $maxDepth }
$job = Start-Job -ScriptBlock $sb -ArgumentList $pwd,0,2
Wait-Job $job | Out-Null
Receive-Job $job

请记住,必须在scriptblock中定义函数,因为脚本在完全独立的PowerShell进程中运行。任何外部定义的变量也是如此 - 它们必须通过Start-Job参数传递到-ArgumentList。这些值将被序列化,传递给执行作业的PowerShell进程,然后将它们提供给scriptblock。