powershell 为什么ForObject -Parallel给出空值表达式,但不带-Parallel标志?

67up9zun  于 2023-03-30  发布在  Shell
关注(0)|答案(1)|浏览(120)

此问题在此处已有答案

Error access to variable after try catch in PowerShell 7(1个答案)
21天前关闭。
我创建了一个可以工作的ForEach-Object,但是一旦我添加了-Parallel标志,循环就会失败,并显示“你不能在空值表达式上调用方法”。

$outputArray = [System.Collections.ArrayList]@()
$outputArrayP = [System.Collections.ArrayList]@()
$testArray =[System.Collections.ArrayList]@()
$testArrayP =[System.Collections.ArrayList]@()

for ($i=0; $i -le 1000;$i++){
    $testArray.Add("Hello $i")>$null
    $testArrayP.Add("Hello $i")>$null
}

$testArray | ForEach-Object { 
    $outputArray.Add("Hello $_")>$null
}

$testArrayP | ForEach-Object -Parallel{ 
    $outputArrayP.Add("Hello $_")>$null
} -ThrottleLimit 5

实际的代码将数据库查询存储在一个数组中,我想并行运行这个数组,而不是这个示例代码。
相关问题Making Requests in Parallel with Powershell results in "You cannot call a method on a null-valued expression"其中答案代码也并行工作,但没有回答为什么我的代码会失败。

fdbelqdn

fdbelqdn1#

ForEach-Object -Parallel通过将工作分叉到单独的后台 * 运行空间 * 来工作。
运行空间是托管 * 执行上下文 * 的组件,包括在当前作用域中定义的所有变量,因此在与您调用代码的运行空间不同的运行空间中执行的代码将无法“看到”您定义的变量。
当引用ForEach-Object块中的变量时,可以使用using:作用域修饰符指示PowerShell将对变量的引用从调用运行空间复制到后台运行空间:

$testArrayP | ForEach-Object -Parallel{ 
    ($using:outputArrayP).Add("Hello $_")>$null
} -ThrottleLimit 5

相关问题