You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:37:48