PowerShell 7并行块添加NoteProperty后调用方法报空引用错误
解决PowerShell并行块中自定义类实例方法调用的空引用错误
问题原因
ForEach-Object -Parallel的每个迭代块都运行在独立的**运行空间(Runspace)**中,每个运行空间拥有独立的类型系统:
- 你在并行块内部定义的
test2类,是当前运行空间的独有类型,和主运行空间的类型完全不兼容。 - 虽然通过
$using:test将主空间的对象传入并行块并添加了NoteProperty,但属性值是当前并行运行空间的test2实例。当这个实例回到主运行空间时,跨运行空间的类型不匹配导致方法无法被正确解析,最终触发"Object reference not set to an instance of an object"错误。 - 非并行模式下所有代码在同一运行空间执行,类型统一,因此不会出现问题。
解决方案
将自定义类test2的定义移到主运行空间(并行块外部),让所有并行迭代共享同一个类型:
class test {} # 在主运行空间定义test2类,所有并行块共享该类型 class test2 { testmethod () { Write-Host "test method called" } } $test = [test]::New() 1..2 | ForEach-Object -Parallel { Add-Member -InputObject $using:test -MemberType NoteProperty -Name "property$_" -Value ([test2]::New()) } $test.property1.testmethod()
补充说明
- 主运行空间定义的类会被所有并行运行空间继承,因此并行块中可以直接引用
[test2]创建实例,无需额外处理。 - 此时添加到
$test的test2实例属于主运行空间的统一类型,回到主空间后方法可以正常调用。
内容的提问来源于stack exchange,提问作者SmoothJarManiac
相关产品推荐
相关产品推荐

