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

svmlkihl  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(369)

目标:我正在尝试获取所有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
}
7vhp5slm

7vhp5slm1#

下面是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:\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) 
}
3pvhb19x

3pvhb19x2#

您有几个问题,您的代码将需要一些重新工作,但您的关闭。
您最大的问题是在本地文件系统的当前目录中查找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

相关问题