【问题标题】:Powershell: Recursive Functions and Multiple Parameters in Start-JobPowershell:Start-Job 中的递归函数和多个参数
【发布时间】:2014-11-03 14:07:34
【问题描述】:

几天来,我一直在用头撞墙,试图让 Start-Job 和后台作业工作无济于事。

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

我有许多递归函数,需要拆分脚本以在更大数据集的许多块上并行工作。

无论我如何安排 Start-Job 调用,似乎都没有任何效果,而且递归函数似乎使一切变得困难。

谁能给我一个 Start-Job 调用递归函数并具有多个参数的工作示例,或者将我指向某个存在的地方?

任何帮助表示赞赏

【问题讨论】:

  • 不清楚什么不起作用,因为您没有向我们展示任何代码,也没有给我们任何输出继续。我什至不确定我是否完全理解您要做什么(您是在递归地开始工作还是只是试图启动一个调用递归函数的脚本)或者为什么多个参数会导致困难(什么有多个参数?递归函数或脚本)。一个简单、完整的示例,说明没有与输出/错误消息一起使用的内容将解决此问题。

标签: multithreading powershell recursion parameters


【解决方案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

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

【讨论】:

  • 是的,但这没有多个参数。不知道为什么要强调这一点,但现在我的猜测是有一个像EnumFiles($dir, $filter) 这样的电话并没有像大多数人认为的那样做。
  • 如果是这种情况,Set-StrictMode -Version Latest 应该直接设置 OP。 :-)
  • 我更新了答案,让脚本块接受多个参数。
猜你喜欢
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 2021-12-12
  • 2014-02-01
  • 2016-07-22
  • 2013-01-15
  • 2013-10-17
  • 1970-01-01
相关资源
最近更新 更多