Загружать только новые файлы из каталога FTP в локальную папку с помощью PowerShell - PullRequest
0 голосов
/ 24 октября 2018

У меня есть сценарий PowerShell, который загружает все файлы из каталога FTP в локальную папку (спасибо Мартину Прикрилу).

Каталог 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 голосов
/ 24 октября 2018

В вашем цикле проверьте, существует ли локальный файл, прежде чем вы его фактически загрузите:

$localFilePath = $target + $file
if (-not (Test-Path $localFilePath))
{
    $webclient.DownloadFile($source, $localFilePath)
}    

Поскольку вы фактически не храните локальные файлы, вы должны помнить, какие файлы уже былизагружено в какой-то журнал:

# Load log
$logPath = "C:\log\path\log.txt"

if (Test-Path $logPath)
{
    $log = Get-Content $logPath
}
else
{
    $log = @()
}

# ... Then later in the loop:

foreach ($file in ($files | where {$_ -like "*.*"})){
    # Do not download if the file is already in the log.
    if ($log -contains $file) { continue }

    # If this is a new file, add it to a log and ...
    $log += $file

    # ... download it using your code
}

# Save the log    
Set-Content -Path $logPath -Value $log

Обратите внимание, что ваш код для разделения списка на строки не очень надежен.Для лучшего решения см. Мой ответ на PowerShell FTP файлы загрузки и подпапки .

...