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

通过PowerShell保存WinSCP会话失败,求正确实现方案

解决WinSCP会话无法保存到GUI列表的问题

我看了你的代码,问题很明确:你只是初始化了会话参数和Session对象,但WinSCP.NET程序集不会自动把会话配置同步到WinSCP GUI的会话列表中——你的代码目前只完成了“准备会话连接参数”的步骤,没有执行“保存会话到配置文件”的操作。

下面给你两种可行的解决办法:

方案一:使用WinSCP.NET的SaveToFile方法直接保存会话

WinSCP的SessionOptions类提供了SaveToFile方法,可以把会话配置写入WinSCP的默认配置文件(GUI读取的就是这个文件)。你需要给会话指定一个名称,这样GUI里才能显示出来。

修改后的完整代码:

try { 
    # Load the WinSCP .NET assembly
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll" 

    # Configure session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ 
        Protocol = [WinSCP.Protocol]::Sftp
        HostName = "xxx.cloud.com" 
        UserName = "sftpuser_WIN_NPD" 
        PortNumber = 40022  # 注意:PortNumber是整数类型,不要用字符串
        SshPrivateKeyPath = "C:\key\sftp_private.ppk" 
        SshHostKeyFingerprint = "ssh-rsa 2048 0c:ce:5a:8a:82:f6:03:xx:xx:xx:xx:xx:xx:xx:xx:xx" 
        SessionName = "My SFTP Session"  # 给会话起一个GUI里显示的名称
    } 

    # 获取WinSCP的默认配置文件路径(通常在用户目录下)
    $winscpIniPath = Join-Path $env:APPDATA "WinSCP\WinSCP.ini"

    # 保存会话到配置文件
    $sessionOptions.SaveToFile($winscpIniPath, $true)  # $true表示覆盖同名会话

    Write-Host "会话已成功保存到WinSCP GUI列表!"
} 
catch { 
    Write-Host "错误: $($_.Exception.Message)" 
    exit 1 
}

关键点说明:

  • 给SessionOptions添加SessionName属性:这是GUI里显示的会话名称,必须指定。
  • PortNumber要使用整数类型:你原来的代码里用了字符串"40022",虽然可能不报错,但建议用整数更规范。
  • SaveToFile的第二个参数$true:如果已经存在同名会话,会覆盖它;如果设为$false,则会抛出异常。

方案二:调用WinSCP命令行工具保存会话

如果.NET方法遇到权限或其他问题,你也可以直接调用WinSCP的命令行工具WinSCP.exe来保存会话:

# 定义会话参数
$sessionName = "My SFTP Session"
$hostName = "xxx.cloud.com"
$userName = "sftpuser_WIN_NPD"
$port = 40022
$privateKeyPath = "C:\key\sftp_private.ppk"
$hostKeyFingerprint = "ssh-rsa 2048 0c:ce:5a:8a:82:f6:03:xx:xx:xx:xx:xx:xx:xx:xx:xx"

# 构建WinSCP命令行参数
$command = @"
open sftp://$userName@$hostName:$port -privatekey="$privateKeyPath" -hostkey="$hostKeyFingerprint"
save "$sessionName"
exit
"@

# 调用WinSCP命令行
& "C:\Program Files (x86)\WinSCP\WinSCP.exe" /command $command

if ($LASTEXITCODE -eq 0) {
    Write-Host "会话保存成功!"
} else {
    Write-Host "会话保存失败,错误码: $LASTEXITCODE"
}

关键点说明:

  • 命令行里的save指令会把当前连接的会话保存到GUI列表中。
  • 确保WinSCP.exe的路径正确,如果你的WinSCP安装在其他目录,要调整路径。

两种方法都能实现你的需求,推荐先用方案一,因为它直接用.NET库操作,更集成化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:28:12