![](/img/trans.png)
[英]Error handling within Foreach-object Parallel block - Powershell 7
[英]Adding all module functions into foreach-Object -Parallel block
我有一个我需要发出的 API 请求列表,我正在尝试使用 Foreach-Object -Parallel 加速它:
$funcDef = ${function:Request-Something}.ToString()
$results = [System.Collection.ArrayList]@()
$requests | ForEach-Object -parallel {
${function:Request-Something} = $using:funcDef
$null = ($using:results).add((Request-Something -request $_))
}
但是, Request-Something
从同一模块APIHelpers.psm1
调用了许多其他自定义函数
我需要一种方法将所有必要的功能添加到该脚本块中
我正在考虑构建一个将函数名称映射到函数文本的哈希表,但我无法弄清楚将变量传递给$function
的语法:
$funcDefs = @{}
(Get-Command -Module APIHelpers).Name | ForEach-Object {
$name = $_
$funcDefs[$name] = ${function:$`{name`}} #This does NOT work, I can't figure out the syntax
}
一旦我建立了这个哈希表,我想我可以修改原始代码:
$requests | ForEach-Object -parallel {
foreach ($funcName in $using:funcDefs.keys) {
${function:$funcName} = $using:funcDefs[$funcName]
}
$null = ($using:results).add((Request-Something -request $_))
}
${function:$`{name`}}
#这不起作用,我无法弄清楚语法
您正在使用namespace variable notation ,它仅支持文字项目名称。 [1]
使用针对function:
drive 的等效Get-Content
调用,它允许您使用变量:
$funcDefs[$name] = (Get-Content function:$name).ToString()
或者,您可以通过Invoke-Expression
( iex
) 使用快捷方式,通常应该避免这种情况,但是: (Invoke-Expression "`${function:$name}").ToString()
退一步:你不能只在-Parallel
脚本块中调用Import-Module
吗?
请注意,作为未来的增强,正在考虑将调用者的状态复制到并行线程,这意味着调用者看到的所有函数也对线程隐式可用; 参见GitHub 问题 #12240 。
[1] 从某种意义上说,您不能使用变量名称或表达式。 字面上指定的名称实际上 - 并且出乎意料地 - 解释为通配符模式,如本答案中所述。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.