WinSCP PowerShell FTP拉取Nitrado我的世界服务器backups文件夹失败问题
问题根因
该问题并非Nitrado服务器特性或功能缺失导致,属于WinSCP .NET库的GetFiles方法参数与FileMask规则的搭配错误:
- 你传入
GetFiles的首个远程路径参数为/minecraftbukkit,WinSCP会优先校验该顶层目录是否匹配FileMask规则:当FileMask设为backups/时,/minecraftbukkit目录名与规则不匹配,因此直接被排除传输,对应日志中的File "/minecraftbukkit" excluded from transfer提示。 - 当
FileMask设为*时,顶层目录匹配通配符规则,WinSCP会递归下载该目录下所有内容,因此出现全量下载的现象。
解决方案
提供两种可实现需求的修改方案:
方案1:直接指定目标远程路径(推荐)
无需使用FileMask过滤,直接指向要下载的backups目录本身,仅需修改两处代码:
- 将
$folderPath2的赋值修改为:
$folderPath2 = '/minecraftbukkit/backups'
- 删除
$transferOptions.FileMask = "backups/"这一行配置即可。
修改后会直接将整个backups目录及全部内容下载到本地test目录下。
方案2:保留原远程路径通过掩码筛选
如果需要保持远程根路径为/minecraftbukkit,通过掩码筛选子目录,修改两处代码:
- 将
$folderPath2的赋值修改为匹配所有子项的格式:
$folderPath2 = '/minecraftbukkit/*'
- 保留
$transferOptions.FileMask = "backups/"配置即可。
附加修正建议
你当前代码执行的是下载操作,代码内注释、成功/失败提示中的Upload属于笔误,建议修改为Download避免后续逻辑混淆。
修正后的完整代码如下:
try { # Load WinSCP .NET assembly Add-Type -Path "D:\Users\username\Downloads\Minecraft stuff\Scripts\WinSCPnet.dll" $folderPath = 'D:\Users\username\Downloads\Minecraft stuff\test' $folderPath2 = '/minecraftbukkit/backups' # Session.FileTransferProgress event handler function FileTransferProgress { param($e) # New line for every new file if (($script:lastFileName -ne $Null) -and ($script:lastFileName -ne $e.FileName)) { Write-Host } # Print transfer progress Write-Host -NoNewline ("`r{0} ({1:P0})" -f $e.FileName, $e.FileProgress) # Remember a name of the last file reported $script:lastFileName = $e.FileName } $script:lastFileName = $Null # Setup session options $sessionOptions = New-Object WinSCP.SessionOptions -Property @{ Protocol = [WinSCP.Protocol]::ftp HostName = "hostname" PortNumber = 21 UserName = "username" Password = "password" } $session = New-Object WinSCP.Session try { # Will continuously report progress of transfer $session.add_FileTransferProgress( { FileTransferProgress($_) } ) $session.SessionLogPath = "sessionlog.txt" # Connect $session.Open($sessionOptions) # Download files $transferOptions = New-Object WinSCP.TransferOptions $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary [array]$transferResult += $session.GetFiles($folderPath2, $folderPath , $False, $transferOptions) # Throw on any error $transferResult.Check() # Print results foreach ($transfer in $transferResult.Transfers) { Write-Host "Download of $($transfer.FileName) succeeded" } foreach ($transfer in $transferResult.Failures) { Write-Host "Download of $($transfer.FileName) Failed" } } finally { # Disconnect, clean up $session.Dispose() } exit 0 } catch { Write-Host "Error: $($_.Exception.Message)" exit 1 }
服务器目录结构参考:
内容的提问来源于stack exchange,提问作者Aelux
相关产品推荐
相关产品推荐

