问题:
我有一个使用 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(使用前将#替换为@)