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

PowerShell使用双脚本方案加载DLL,解决WinSCP类库TypeNotFound错误

报错根本原因

PowerShell执行脚本时会先完成语法和类型解析阶段,再逐行运行代码。你将Add-Type加载DLL的逻辑放在CreateSession函数内部,解析函数代码时WinSCP相关类型还未被加载,就会直接触发类型找不到的错误,和你运行时才执行Add-Type的顺序冲突。

双脚本实现方案

第一步:编写DLL加载脚本(命名为Load-WinSCP.ps1)

这个脚本单独完成DLL加载校验逻辑,避免重复加载,代码如下:

# 校验WinSCPnet.dll路径是否存在
$winscpDllPath = Join-Path $PSScriptRoot "\winscp\WinSCPnet.dll"
if (-not (Test-Path $winscpDllPath)) {
    throw "未找到WinSCP程序集:$winscpDllPath"
}

# 避免重复加载程序集
if (-not ([System.Management.Automation.PSTypeName]'WinSCP.Protocol').Type) {
    Add-Type -Path $winscpDllPath | Out-Null
}

第二步:主脚本引入加载脚本后调用相关类

主脚本开头先通过点引用的方式加载上述脚本,再执行你的业务逻辑,示例代码如下:

# 点引用加载WinSCP程序集,注意前面的点和空格不可省略
. (Join-Path $PSScriptRoot "Load-WinSCP.ps1")

# 后续可以正常调用所有WinSCP类型,不会报类型不存在错误
function CreateSession {
    try {
        $this.sessionOptions = New-Object WinSCP.SessionOptions -Property @{
            Protocol = [WinSCP.Protocol]::Sftp
            HostName = "你的SFTP地址"
            UserName = "登录账号"
            Password = "登录密码"
            SshHostKeyFingerprint = "SFTP主机密钥指纹"
        }
        
        $session = New-Object WinSCP.Session
        $session.Open($this.sessionOptions)
        # 后续业务逻辑自行补充
    }
    catch {
        throw $_
    }
}

注意事项

  • 确保winscp目录下同时存在WinSCPnet.dll和对应的WinSCP.exe,二者版本必须完全匹配,否则运行时也会触发调用错误
  • 双脚本方案兼容PowerShell 5.1及以上所有版本,适用性更强

内容的提问来源于stack exchange,提问作者CamParker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:00:03