将所有模块函数添加到 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`}}
#This does NOT work, I can't figure out the syntax
您正在使用 ,它仅支持 文字 项名称。[1]
使用针对 function:
驱动器的等效 Get-Content
调用,它允许您使用变量:
$funcDefs[$name] = (Get-Content function:$name).ToString()
或者,您可以通过 Invoke-Expression
(iex
) 走捷径,其中 :(Invoke-Expression "`${function:$name}").ToString()
退一步:你不能在 -Parallel
脚本块中调用 Import-Module
吗?
请注意,作为 未来的增强功能 ,正在考虑将调用者的状态复制到并行线程,这意味着调用者看到的所有函数都隐式可用于线程也;参见 GitHub issue #12240。
[1] 从某种意义上说,您不能使用变量名或表达式。如 .
中所述,字面上指定的名称实际上 - 并且出乎意料地 - 被解释为 通配符模式
我有一个 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`}}
#This does NOT work, I can't figure out the syntax
您正在使用
使用针对 function:
驱动器的等效 Get-Content
调用,它允许您使用变量:
$funcDefs[$name] = (Get-Content function:$name).ToString()
或者,您可以通过 Invoke-Expression
(iex
) 走捷径,其中 (Invoke-Expression "`${function:$name}").ToString()
退一步:你不能在 -Parallel
脚本块中调用 Import-Module
吗?
请注意,作为 未来的增强功能 ,正在考虑将调用者的状态复制到并行线程,这意味着调用者看到的所有函数都隐式可用于线程也;参见 GitHub issue #12240。
[1] 从某种意义上说,您不能使用变量名或表达式。如