仅使用PowerShell将新文件从FTP目录下载到本地文件夹

时间:2018-10-24 19:42:06

标签: .net powershell ftp ftpwebrequest

我有一个PowerShell脚本,可以将所有文件从FTP目录下载到本地文件夹(感谢Martin Prikryl)。

FTP目录在一天中的不同时间使用多个新文件进行更新。

我将每30分钟通过任务计划程序运行一次脚本,以从FTP目录下载文件。

我希望脚本检查并仅将新文件从FTP目录下载到本地文件夹。

注意:必须从FTP目录中进行检查,因为以前下载的文件可能会从本地文件夹中删除。

请参见下面的当前脚本;

#FTP Server Information - SET VARIABLES
$user = 'user' 
$pass = 'password'
$target = "C:\Users\Jaz\Desktop\FTPMultiDownload"
#SET FOLDER PATH
$folderPath = "ftp://ftp3.example.com/Jaz/Backup/"

#SET CREDENTIALS
$credentials = new-object System.Net.NetworkCredential($user, $pass)

function Get-FtpDir ($url,$credentials) {
    $request = [Net.WebRequest]::Create($url)
    $request.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory
    if ($credentials) { $request.Credentials = $credentials }
    $response = $request.GetResponse()
    $reader = New-Object IO.StreamReader $response.GetResponseStream() 
    $reader.ReadToEnd()
    $reader.Close()
    $response.Close()
}

$Allfiles=Get-FTPDir -url $folderPath -credentials $credentials
$files = ($Allfiles -split "`n")

$files 

$webclient = New-Object System.Net.WebClient 
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)
$counter = 0
foreach ($file in ($files | where {$_ -like "*.*"})){
    $source=$folderPath + $file
    $destination = Join-Path $target $file
    $webclient.DownloadFile($source, $destination)

    #PRINT FILE NAME AND COUNTER
    $counter++
    $counter
    $source
}

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

在循环中,在实际下载本地文件之前,先检查其是否存在:

create /(?znode) value

由于您实际上并不保留本地文件,因此必须记住在某种日志中已经下载了哪些文件:

create /test init

请注意,将列表拆分为行的代码不是很可靠。有关更好的解决方案,请参见我对PowerShell FTP download files and subfolders的回答。