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」错误,无法完成下载
可能原因
- 目录遍历范围剧增:即便目标文件与
ClientFolder层级不多,/CompanyName/HealthFiles/下可能存在大量子目录或文件。WinSCP需要遍历整个目录树来匹配*Finance.xlsx掩码,当目录规模超出默认超时时间的处理能力时,就会触发超时。 - 服务器端限制: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
相关产品推荐
相关产品推荐

