在ForEach-Object -Parallel{}中,我试图调用在函数之前定义的变量名。这需要$Using:Name
从函数外部拉入变量。
但是,当尝试使用$Using:$Name
或$Using:(Get-Variable -Name $Name)
时,它提供了一个错误:“变量引用无效。':'后面没有有效的变量名称字符。请考虑使用${}来分隔名称。”
当尝试使用${Using:$Name}
时,{}
给出了文字字符串,并且不起作用。其他尝试使其起作用的变体要么提供相同的变量引用无效,要么变量为null。
尝试的变体:
$Using:{(Get-Variable -Name $Name)}
$Using:(Get-Variable -Name $Name)
Get-Variable -Name "Using:$Name"
Get-Variable -Name Using:$Name
字符串
代码示例:
$0IndexA = @(45,51,57)
$1IndexA = @(1490,1901,1903)
0..1 | Foreach-Object -Parallel {
$ParallelNumber = $_ # Used for readability
For ($c = 0; $c -le (Get-Variable $ParallelNumber"IndexA").value.count; $c++){
Get-Variable -Name $ParallelNumber"IndexA"[$c]
}
}
型
错误:找不到名为“0 IndexA”的变量。
尝试使用-scope 1错误:“作用域编号”% 1“超过活动作用域的数目。(参数”Scope“)实际值为% 1。”
2条答案
按热度按时间w51jfk4q1#
你正在寻找 * 变量间接性 *,即通过存储在 * 另一个 * 变量中的变量名 * 间接地 * 引用变量的能力。
然而,在
$using:
作用域的上下文中,这是 * 不 * 支持的::
* 之后的内容必须 * 是 * 文字 * 变量名。正如Darin所建议的,一个解决办法是在调用者的作用域中使用hashtable,将输入对象Map到要用于它们的值:
字符串
注意需要将
$using:
引用包含在(...)
中,以便对其应用索引([$_]
)。[1]可以说,这不应该是必要的,但从PowerShell 7.3.9开始-请参阅GitHub issue #10876进行讨论。
vx6bjr1n2#
@mkelement answer似乎是一个很好的解决方案。如果这对你不起作用,另一个解决方案是使用jobs而不是
Foreach-Object -Parallel
,这样你就可以将变量作为输入参数传递。我重新制作了你的样本,以证明:
字符串