繁体   English   中英

将所有模块函数添加到 foreach-Object -Parallel 块中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM