首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用WinSCP .NET程序集将一天前的文件从所有FTP目录下载到一个本地目录

使用WinSCP .NET程序集将一天前的文件从所有FTP目录下载到一个本地目录
EN

Stack Overflow用户
提问于 2022-10-26 18:56:29
回答 2查看 91关注 0票数 1

目标:我试图得到所有的文件,是1天或更新的。远程目录有很多目录和根目录上的文件。

我需要查看每个目录,获取任何1天前的文件,以及根目录1天前的任何文件,并将所有这些文件传输到1个单一目录。我不想复制任何空目录,或任何目录与旧的文件超过1天。

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

为了满足上面列出的文件要求,GetFiles部分需要说什么?

下面是它看起来的一个例子:

代码:

代码语言:javascript
运行
复制
# 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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-30 17:29:27

有一个WinSCP站点的例子实现了您想要实现的部分目标:

将所有文件从FTP/SFTP下载到同一个本地文件夹

只需添加时间条件,就可以检查:

使用WinSCP从SFTP服务器下载比X天更新的文件,跳过不包含任何匹配文件的文件夹

将这些因素结合在一起,就可以做到:

代码语言:javascript
运行
复制
$remotePath = "/remote/path"
$localPath = "C:\local\path"
$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) 
}
票数 1
EN

Stack Overflow用户

发布于 2022-10-26 22:25:26

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

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

代码语言:javascript
运行
复制
$files = @(Get-ChildItem -Path $lcdPath -Attributes !Directory -Recurse | Where-Object { $_.LastWriteTime -gt $time })

我认为您希望使用列出FTP服务器上的远程文件并从这些数据构建$files列表。(下面的例子取自winscp.net)

代码语言:javascript
运行
复制
        $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)")
        }

您可以根据远程文件的$files来修改此代码以填充您的$fileinfo.LastWriteTime数组,然后将其传递给您的"Transfer“foreach循环。

此外,在尝试/捕捉/最后的代码中有一些语法问题,如下所示:

代码语言:javascript
运行
复制
catch
{
  Write-Host "Error: $($_.Exception.Message)"
  exit 1
}
finally {
  $session.Dispose()
}
exit 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74212923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档