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

PowerShell下WinSCP .NET Assembly GetFiles移除目录后超时问题咨询

解决WinSCP .NET Assembly GetFiles 移除路径层级后超时的问题

问题场景

  • 使用$session.GetFiles时,源路径为/CompanyName/HealthFiles/ClientFolder/*,可正常匹配并下载*Finance.xlsx文件
  • 移除ClientFolder层级,将源路径改为/CompanyName/HealthFiles/*后,触发「Timeout waiting for WinSCP to respond」错误,无法完成下载

可能原因

  1. 目录遍历范围剧增:即便目标文件与ClientFolder层级不多,/CompanyName/HealthFiles/下可能存在大量子目录或文件。WinSCP需要遍历整个目录树来匹配*Finance.xlsx掩码,当目录规模超出默认超时时间的处理能力时,就会触发超时。
  2. 服务器端限制:SFTP服务器可能对目录列表请求有速率限制,或者遍历上层目录时需要更长时间返回数据,导致WinSCP等待超时。

解决方案

  • 增大会话超时时间:在SessionOptions中设置更长的超时值,给WinSCP足够时间完成目录遍历和文件匹配:
    $sessionOptions.Timeout = New-TimeSpan -Minutes 5
    
  • 优化路径与掩码,缩小遍历范围:如果清楚目标文件的子目录结构,可精准指定路径,避免扫描无关目录。比如若所有Finance.xlsx都在子目录的ClientFolder下,可将源路径改为:
    "/CompanyName/HealthFiles/*/ClientFolder/*Finance.xlsx"
    
  • 启用批量目录列表:通过原始设置让WinSCP批量获取目录列表,提升遍历效率:
    $transferOptions.AddRawSettings("DirectoryListBatchSize", "1000")
    
  • 排查服务器端问题:若调整后仍超时,查看SFTP服务器日志,确认是否存在目录读取权限限制或服务器性能瓶颈。

修改后的示例代码

# 初始化会话选项并设置超时
$sessionOptions = New-Object WinSCP.SessionOptions
# 补充你的协议、主机地址、账号密码等配置
$sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
$sessionOptions.HostName = "your-server.com"
$sessionOptions.UserName = "your-username"
$sessionOptions.Password = "your-password"
$sessionOptions.Timeout = New-TimeSpan -Minutes 5

# 连接会话
$session.Open($sessionOptions)

# 配置传输选项
$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.FileMask = "*Finance.xlsx"
$transferOptions.AddRawSettings("ExcludeEmptyDirectories", "1")
$transferOptions.AddRawSettings("DirectoryListBatchSize", "1000")

# 执行下载
$session.GetFiles("/CompanyName/HealthFiles/*", "C:\Users\UserName\Desktop\targetfolder\", $False, $transferOptions).Check()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:00:05