如何将“使用命名空间”传递给正在调用函数的启动线程作业?

2023-12-03

问题:

我有一个使用 Start-ThreadJob 调用的函数,该函数需要以下命名空间才能使用它:

     using namespace System.Diagnostics.Eventing.Reader

我如何让函数看到它?

更深入的潜水:

代码有点复杂,但我生成了一个用于生成线程的对象排队列表,函数名称是标签,这就是被调用的实际函数。我的问题是代码无法识别在脚本顶部声明的命名空间,所以我相信它必须以某种方式传递给函数线程?

代码示例(有点复杂):

     Function MyFunctionName { Write-Host("Hello World") }

     $Queue += [pscustomobject]@{
        Tag = 'MyFunctionName'  # Function to Invoke here
     }

    $commandDefinitions = @{}
    $WorkerJobs = foreach ($Task in $Queue) {
        # If we already have the Definition for this Action
        if ($commandDefinitions.ContainsKey($Task.Tag)) {
            $def = $commandDefinitions[$Task.Tag]  # use it
        }
        else {
            # else, get it and set it
            $def = (Get-Command $Task.Tag -CommandType Function).Definition
            $commandDefinitions[$Task.Tag] = $def
        }
        
        Start-ThreadJob { 
            & ([scriptblock]::Create($using:def)) @Using:Task 
        }
        
    }
    

简而言之,您不应该这样做,因为该解决方案既不漂亮也不可靠。您应该在线程的脚本块内使用类型的完全限定名称。为了演示,这里是您可以如何做到这一点:

$usingStatements = @'
using namespace System.Diagnostics.Eventing.Reader
using namespace System.Collections.Generic
'@

function Test {
    [EventLogReader]
    [EventLogQuery]
    [List[object]]
}

$func = ${function:Test}.ToString()

Start-ThreadJob {
    . ([scriptblock]::Create($using:usingStatements))

    ${function:Test} = $using:func

    Test
} | Receive-Job -Wait -AutoRemoveJob
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将“使用命名空间”传递给正在调用函数的启动线程作业? 的相关文章

随机推荐