【问题标题】:Download one day old files from all FTP directories to one local directory using WinSCP .NET assembly使用 WinSCP .NET 程序集从所有 FTP 目录下载一天前的文件到一个本地目录
【发布时间】:2022-11-07 17:07:32
【问题描述】:

目标:我正在尝试获取所有 1 天或更新的文件。远程目录有很多目录以及根目录上的文件。

我需要查看每个目录,获取 1 天前的任何文件,以及 1 天前根目录上的任何文件,然后将所有这些文件转移到 1 个单个目录中。我不想复制任何空目录或任何包含超过 1 天文件的目录。

当前代码只是继续运行并且不传输任何文件。我不确定我是否正确设置了foreach,以及GetFiles 部分。

GetFiles 部分需要说明什么才能满足上面列出的文件要求?

这是它的外观示例:

代码:

# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"

# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol              = [WinSCP.Protocol]::ftp
    HostName              = "ftp site"
    UserName              = "UserName"
    Password              = "Password"
    SshHostKeyFingerprint = "stuff"
}

$sessionOptions.AddRawSettings("FSProtocol", "2")

$session = New-Object WinSCP.Session
$session.SessionLogPath = $log
try {
    # Connect
    $session.Open($sessionOptions)

    # Set up transfer options
    $transferOptions = New-Object WinSCP.TransferOptions -Property @{
        TransferMode = [WinSCP.TransferMode]::Ascii
    }
    $lcdPath = 'Filepath\'
    $time = (Get-Date).AddDays(-1)   
    $files = @(Get-ChildItem -Path $lcdPath -Attributes !Directory -Recurse | Where-Object { $_.LastWriteTime -gt $time })    
    
    # Transfer files
    foreach ($file in $files) {
        $session.GetFiles($files, "LocalFilePath", $False, $transferOptions).Check()
    }
}
finally {
    $session.Dispose()
}
exit 0
catch
{
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}

【问题讨论】:

    标签: .net powershell ftp winscp winscp-net


    【解决方案1】:

    有一个 WinSCP 站点的示例,它实现了您想要实现的部分目标:
    Downloading all files from FTP/SFTP to the same local folder

    您只需要添加时间条件,您可以检查:
    Download files newer than X days from SFTP server with WinSCP, skipping folders that do not contain any matching files

    将它们结合在一起,这应该可以:

    $remotePath = "/remote/path"
    $localPath = "C:localpath"
    $mask = "*.txt"
     
    $files = $session.EnumerateRemoteFiles(
                 $remotePath, $mask, [WinSCP.EnumerationOptions]::AllDirectories)
     
    $limit = (Get-Date).AddDays(-1)
    $files = $files | Where-Object { $_.LastWriteTime -gt $limit }
    
    foreach ($fileInfo in $files)
    {
        Write-Host "Downloading $($fileInfo.FullName) ..."
        $session.GetFileToDirectory($fileInfo.FullName, $localPath) 
    }
    

    【讨论】:

      【解决方案2】:

      你有几个问题,你的代码需要一些重新工作,但你关闭了。

      您最大的问题是您在本地文件系统的当前目录中的Filepath 中寻找新文件,而不是在 FTP 服务器上:

      $files = @(Get-ChildItem -Path $lcdPath -Attributes !Directory -Recurse | Where-Object { $_.LastWriteTime -gt $time })
      

      我想你想list the remote files on the FTP server 并从这些数据中构建你的$files 列表。 (以下示例取自 winscp.net)

              $session.Open($sessionOptions)
       
              $directory = $session.ListDirectory("/home/martin/public_html")
       
              foreach ($fileInfo in $directory.Files)
              {
                  Write-Host ("$($fileInfo.Name) with size $($fileInfo.Length), " +
                      "permissions $($fileInfo.FilePermissions) and " +
                      "last modification at $($fileInfo.LastWriteTime)")
              }
      

      您可以调整此代码以根据远程文件的$fileinfo.LastWriteTime 填充您的$files 数组,然后将其传递给您的“传输文件”foreach 循环。

      你的 try/catch/finally 代码也有一些语法问题,它应该如下所示:

      catch
      {
        Write-Host "Error: $($_.Exception.Message)"
        exit 1
      }
      finally {
        $session.Dispose()
      }
      exit 0
      

      【讨论】:

      • 谢谢@MisterSmith!我很感激你的帮助!我纠正了我的问题,我正在用你帮助我的代码拉回文件!我需要将其修改为仅拉回大小大于 0 且仅在过去 1 天进行修改的文件。我应该在 ForEach 语句本身还是在 ForEach 内部过滤它?我只需要从根目录递归地获取文件。我将代码的一部分更改为从 FTP 站点的根目录中提取: $directory = $session.ListDirectory("/")
      • 另外,我感谢在查找本地目录而不是 FTP 目录的逻辑缺陷方面的帮助。
      • ListDirectory 只会列出指定目录的内容。您可以改为使用 Session.EnumerateRemoteFiles 进行递归搜索。我建议您在 foreach 循环之前定义 $files = @()(一个空数组),然后在 foreach 中您可以测试每个文件以确认 LastWriteTimeLength 等符合您的条件并将远程路径附加到您的 @987654334 @ 大批。看看这里列出的例子:winscp.net/eng/docs/…
      • 感谢您所有的帮助。我无法让 Session.enumerateRemoteFiles 工作,所以我选择了一条不同的路径,我会把它作为答案,以防它对其他人有帮助。
      猜你喜欢
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 2017-01-16
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多