peterz
Goto Top

Automatischer ftp-Download

Hallo zusammen,

ich möchte gerne Dateien von einem ftp-Server automatisiert herunterladen.
Dabei sollen alle Dateien der letzten 2 Wochen heruntergeladen werden, sollten die Dateien schon da sein, sollen sie nicht überschrieben werden.
Hat da jemand eine Idee, wie man sowas bewerkstelligen könnte?

Vielen Dank

Content-ID: 668218

Url: https://administrator.de/contentid/668218

Ausgedruckt am: 26.09.2024 um 23:09 Uhr

stacktrace
Lösung stacktrace 18.09.2024 um 12:38:15 Uhr
Goto Top
Moin,

ungetestet:

# FTP-Server Konfigurationsdaten
$ftpServer = "ftp://ftp.example.com"  
$ftpUsername = "username"  
$ftpPassword = "password"  
$ftpDir = "/path/on/ftp"  
$localDir = "C:\path\to\local\directory"  

# Datum für die letzten 14 Tage
$twoWeeksAgo = (Get-Date).AddDays(-14)

# Funktion zum Herunterladen einer Datei von FTP
function Download-FTPFile {
    param (
        [string]$ftpUrl,
        [string]$localPath,
        [string]$ftpUser,
        [string]$ftpPass
    )
    
    $webClient = New-Object System.Net.WebClient
    $webClient.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPass)
    
    # Datei nur herunterladen, wenn sie nicht lokal existiert
    if (-not (Test-Path -Path $localPath)) {
        try {
            $webClient.DownloadFile($ftpUrl, $localPath)
            Write-Host "Heruntergeladen: $localPath"  
        } catch {
            Write-Host "Fehler beim Herunterladen der Datei: $ftpUrl"  
        }
    } else {
        Write-Host "Datei existiert bereits: $localPath"  
    }
}

# Funktion zum Prüfen des Änderungsdatums einer Datei auf dem FTP-Server
function Get-FTPFileModifiedTime {
    param (
        [string]$ftpUrl,
        [string]$ftpUser,
        [string]$ftpPass
    )
    
    $request = [System.Net.FtpWebRequest]::Create($ftpUrl)
    $request.Method = [System.Net.WebRequestMethods+Ftp]::GetDateTimestamp
    $request.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPass)
    
    try {
        $response = $request.GetResponse()
        $lastModified = $response.LastModified
        $response.Close()
        return $lastModified
    } catch {
        Write-Host "Fehler beim Abrufen des Änderungsdatums: $ftpUrl"  
        return $null
    }
}

# Liste der Dateien auf dem FTP-Server abrufen
function Get-FTPFileList {
    param (
        [string]$ftpUrl,
        [string]$ftpUser,
        [string]$ftpPass
    )
    
    $request = [System.Net.FtpWebRequest]::Create($ftpUrl)
    $request.Method = [System.Net.WebRequestMethods+Ftp]::ListDirectoryDetails
    $request.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPass)
    
    try {
        $response = $request.GetResponse()
        $reader = New-Object IO.StreamReader $response.GetResponseStream()
        $fileList = $reader.ReadToEnd()
        $reader.Close()
        $response.Close()
        return $fileList
    } catch {
        Write-Host "Fehler beim Abrufen der Datei-Liste: $ftpUrl"  
        return $null
    }
}

# Hauptlogik
$ftpUrl = "$ftpServer$ftpDir"  
$fileList = Get-FTPFileList -ftpUrl $ftpUrl -ftpUser $ftpUsername -ftpPass $ftpPassword

if ($fileList) {
    $fileList -split "`n" | ForEach-Object {  
        # Dateiname aus der Liste extrahieren (ggf. muss das je nach FTP-Server angepasst werden)
        $fileName = ($_ -split "\s+")[-1]  
        $ftpFileUrl = "$ftpUrl/$fileName"  
        $localFilePath = Join-Path $localDir $fileName
        
        # Änderungsdatum der Datei abrufen
        $lastModified = Get-FTPFileModifiedTime -ftpUrl $ftpFileUrl -ftpUser $ftpUsername -ftpPass $ftpPassword
        
        if ($lastModified -and $lastModified -ge $twoWeeksAgo) {
            # Datei herunterladen, wenn sie in den letzten zwei Wochen geändert wurde
            Download-FTPFile -ftpUrl $ftpFileUrl -localPath $localFilePath -ftpUser $ftpUsername -ftpPass $ftpPassword
        } else {
            Write-Host "Datei $fileName ist älter als zwei Wochen."  
        }
    }
}

Zu speichern als *.ps1 - es handelt sich hier um ein Powershellscript.

Gruß
mbehrens
Lösung mbehrens 18.09.2024 um 12:42:04 Uhr
Goto Top
Zitat von @Peterz:

Hat da jemand eine Idee, wie man sowas bewerkstelligen könnte?

Z. B. mit den Automatisierungsmöglichkeiten von WinSCP.
SachsenHessi
Lösung SachsenHessi 18.09.2024 um 13:10:57 Uhr
Goto Top
Gut ist auch "PyroBatch" (https://www.heise.de/download/product/pyrobatchftp-10944)
Kann ich nur wärmstens empfehlen.
Mfg
SH
cse
Lösung cse 18.09.2024 um 13:30:45 Uhr
Goto Top
Zieh dir mal das nei:

Watch FTP

Das ist ein echt tolles Tool, für Business kostet das nicht mal viel (was bei 100 takken).

Kann Folder überwachen und dann nach Wunsch Aktionen ausführen (kopieren, Mail schicken, löschen, verschieben, naja halt den ganzen kram den man sonst per Hand macht). Achtung: es bietet sich an die "Aufgaben" in Watch FTP als Dienst zu aktivieren, dann muss das Tool nimma laufen.
insidERR
Lösung insidERR 18.09.2024 um 14:15:33 Uhr
Goto Top
Guck dir FreeFileSync an.
Damit synchronisiere ich automatisiert, täglich ne NAS mit einem Fileserver. Kann viele Protokolle.
Kostet nix, lebt aber von freiwilligen Spenden.
Ted555
Lösung Ted555 18.09.2024 aktualisiert um 15:34:56 Uhr
Goto Top
Oder WinSCP Einzeiler
winscp /command "option batch on" "option confirm off" "open ftp://domain.com -username=XXXXXX -password=XXXXXXXXXXXX" "synchronize local -transfer=binary D:\local\folder /remote/path " close exit  
Peterz
Peterz 18.09.2024 um 15:48:56 Uhr
Goto Top
Jetzt habe ich ja wirklich viele Hinweise bekommen, die ich mir alle mal ansehen werde.
Vielen Dank face-smile