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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:24:02