PowerShell:无法使用变量变量$Using:(Get-Variable -Name $Name)

pgky5nke  于 2023-11-18  发布在  Shell
关注(0)|答案(2)|浏览(133)

在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。”

w51jfk4q

w51jfk4q1#

你正在寻找 * 变量间接性 *,即通过存储在 * 另一个 * 变量中的变量名 * 间接地 * 引用变量的能力。
然而,$using:作用域的上下文中,这是 * 不 * 支持的: * 之后的内容必须 * 是 * 文字 * 变量名。
正如Darin所建议的,一个解决办法是在调用者的作用域中使用hashtable,将输入对象Map到要用于它们的值:

# Helper hashtable that maps each input to ForEach-Object -Parallel
# to values to use with that input.
$valuesHash = @{
  0 = @(45,51,57)
  1 = @(1490,1901,1903)
}

0..1 | Foreach-Object -Parallel {
  $values = ($using:valuesHash)[$_]
  "$values" # sample output; -> '45 51 57', '1490 1901 1903'
}

字符串
注意需要将$using:引用包含在(...)中,以便对其应用索引([$_])。
[1]可以说,这不应该是必要的,但从PowerShell 7.3.9开始-请参阅GitHub issue #10876进行讨论。

vx6bjr1n

vx6bjr1n2#

@mkelement answer似乎是一个很好的解决方案。如果这对你不起作用,另一个解决方案是使用jobs而不是Foreach-Object -Parallel,这样你就可以将变量作为输入参数传递。
我重新制作了你的样本,以证明:

$0IndexA = @(45,51,57)
$1IndexA = @(1490,1901,1903)

$parJobs = 0..1 | foreach {
    Start-Job { 
    Param($0IndexA, $1IndexA, $ParallelNumber)
        For ($c = 0; $c -le (Get-Variable "$($ParallelNumber)IndexA").value.count; $c++){
            (Get-Variable -Name "$($ParallelNumber)IndexA").value[$c]
        }
    } -ArgumentList $0IndexA,$1IndexA, $_
} 

Wait-Job $parJobs | Receive-Job

字符串

相关问题