如何在PowerShell RunspacePool中导入自定义类?
解决RunspacePool中无法调用自定义PowerShell类的问题
问题出在你用模块名称导入,RunspacePool无法通过名称定位到模块文件。改用模块的完整路径导入InitialSessionState即可解决,无需修改类架构。
具体修改步骤
在AsyncTask.Class.psm1的GetRunspacePool方法中,收集模块的完整路径而非名称:
[System.Management.Automation.Runspaces.RunspacePool] GetRunspacePool() { if($null -eq $this.RunspacePool) { $modules = Get-Module; $ModulesToLoad = @() ## 改为收集模块完整路径 foreach ($module in $modules){ if ($module.Name -in "BaseError.Class", "EventBus.Class", "ConnectionManager.Class","ConnectionConfig.Class" ) { $ModulesToLoad += $module.Path # 用Path代替Name } } write-host "[AsyncTask]Starting Runspace Pool" $MaxThreads = 5 $SessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() $SessionState.ImportPSModule($ModulesToLoad) # 用路径数组导入模块 $this.RunspacePool = [runspacefactory]::CreateRunspacePool(1, $MaxThreads, $SessionState,$global:Host) $this.RunspacePool.Open() } return $this.RunspacePool }
原因说明
Using module加载的模块在主线程会话中可用,但RunspacePool是独立的执行环境,无法通过模块名称自动定位到文件位置。- 直接传入模块的完整路径,RunspacePool可以准确定位并加载包含自定义类的模块文件,确保脚本块执行时能找到
[ConnectionManager]等类型。
额外验证
可以在异步脚本块开头添加Get-Module命令,确认模块是否成功加载:
$Scriptblock = { param($Param) Get-Module # 验证模块加载情况 Start-Sleep -Seconds (Get-Random -Minimum 1 -Maximum 5) $a = [ConnectionManager]::GetShared() # ... 剩余代码 }
内容的提问来源于stack exchange,提问作者ibsenleo
相关产品推荐
相关产品推荐

