tugsi76
Goto Top

Batch neueste Dateien aus Unterordnern kopieren und per FTP verschicken

Hallo zusammen,
wurde von einen Freund angesprochen, da ich einiges mit PCs mache und er da überhaupt nicht fit ist, ob ich ihn da helfen kann.
Allerdings ist Batch/Shell für mich schon etwas her, da ich mittlerweile mehr im Bereich Linux unterwegs bin, aber ich möchte ihn da gerne helfen.

Aufgabe:
Es sollen die letzten 7 aktuellsten Dateien aus einem bestimmten Verzeichnisbaum per FTP verschickt werden. (Zahl 7 ist variabel, je nachdem wie oft man es nachher pro Woche ausführt)
Es gibt jeden Tag eine neu erstellte Datei, eine Zusammenfassung vom Vortag (ähnlich eines Logfiles).

Problem:
Verzeichnisstruktur ist D:/Dateiablage/Jahr/Monat/

Theoretisch könnte man das aktuelle Datum auslesen, allerdings wäre man beim Monatssprung im falschen Monat.

Beispiel 1. Februar, ich erkenne das Februar ist und würde dann nach D:/Dateiablage/2025/Februar springen.
Die Datei wird zwar am 1.Feb erstellt, aber ist vom 31.Jan und wird somit vom Ursprungsprogramm in D:/Dateiablage/2025/Januar abgelegt.

Somit schwebt mir eher sowas vor wie, schaue in den Verzeichnis D:/Dateiablage rekursiv nach den neuesten 7 Dateien (ist nur ein Beispiel mit 7 Dateien, hängt nachher von der Häufigkeit ab, wie oft per FTP verschickt wird in der Woche).

Diese X-Dateien könnte man dann in ein Zwischenordner kopieren, aus welchen anschließend das FTP-Programm die Dateien auslesen kann. Danach wird der Zwischenordner wieder geleert.

Ich habe gesehen, dass FileZilla auch per Konsolenbefehle angestossen werden kann, wäre ja eine Möglichkeit zu benutzen, zumal er bisher die Daten mit FileZilla händisch rüberkopiert.

Betriebssystem ist Windows 10.

Hat irgendjemand so oder so ähnlich schon mal was gemacht?

Vielen Dank im Voraus.
Gruß Thomas

Content-ID: 671095

Url: https://administrator.de/forum/batch-neueste-dateien-aus-unterordnern-kopieren-und-per-ftp-verschicken-671095.html

Printed on: February 9, 2025 at 07:02 o'clock

Cloudrakete
Cloudrakete Feb 02, 2025 at 23:54:58 (UTC)
Goto Top
Moin,

ich würde es schon mal nicht mit Batch machen. Mit PowerShell wird das ganze deutlich einfacher.

Hiermit kannst Du schon mal die aktuellsten 7 Dateien (rekursiv) auslesen. Ich hab das so ähnlich in einem anderen Skript, da gebe ich den Pfad via $sourcepfad in einer Variable an. Du kannst hier alternativ auch den deinen Einstiegspfad einfügen.
Get-ChildItem $sourcePath -Recurse -File | Sort-Object LastWriteTime -Descending | Select-Object -First 7

Das kannst Du jetzt theoretisch in eine Schleife + Copy-Funktion packen und dann werden die Daten schon mal an deine Wunschstelle kopiert. Das könnte dann wie folgt aussehen:

Get-ChildItem $sourcePath -Recurse -File | Sort-Object LastWriteTime -Descending | Select-Object -First 7| ForEach-Object {
    $destinationFile = Join-Path -Path $destinationPath -ChildPath $_.Name
    Copy-Item -Path $_.FullName -Destination $destinationFile
}


Für den FTP-Kram gibt es bestimmt auch jemanden, der mal etwas für Filezilla geschrieben hat. SFTP mit WinSCP geht auf jeden fall recht einfach.

Copy-Schleife via ChatGPT generiert
tugsi76
tugsi76 Feb 03, 2025 at 13:20:39 (UTC)
Goto Top
Danke @Cloudrakete.
Ok, PowerShell, da siehst wie lange es schon her ist bei mir mit Windows *lach ...
Ich hab das mal getestet, das klappt schon mal sehr gut!
Danke Dir!

FileZilla war nur so ein Gedanke, weil es schon installiert ist, aber das soll jetzt keine in Stein gemeißelte Idee sein, WinSCP o.ä. geht natürlich auch.
151434
Solution 151434 Feb 03, 2025 updated at 14:37:12 (UTC)
Goto Top
WinSCP quick n dirty mit der WinSCP.com
$files = (Get-ChildItem -LiteralPath "D:\Ordner" -Recurse -File | sort LastWriteTime -Descending | select -F 4 -Expand Fullname) -join ' '  
&"D:\Path\to\WinSCP.com" /command "option confirm off" "option batch on" "open ftp://myuser:mypassword@myftp.com" "put $files /my/target/path/" "close" "exit"  

Oder bei WinSCP dann doch besser zur .NET DLL oder Modul greifen da hat man mehr Kontrolle, hier n' Beispiel mit nem SFTP Server:

# quellordner
$localfolder = 'D:\Dateiablage'  
# Zielordner 
$remotepath = '/remote/folder/'  
# load .NET DLL
Add-Type -Path "D:\Ordner\WinSCPnet.dll"  
# get newest x files
$files = Get-ChildItem -LiteralPath $localfolder -Recurse -File | sort LastWriteTime -Descending | select -F 7
# slash am Ende des Remote-Pfades ergänzen falls nicht vorhanden
$remotepath = $remotepath -replace '(?<!/)$','/'  
# connection options
$options = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    Hostname = 'X.X.X.X'  
    Username = 'USERNAME'  
    Password = 'PASSWORD'  
    # to accept all Fingerprints
    GiveUpSecurityAndAcceptAnySshHostKey = $true
}
# Transfer-Optionen
$transoptions = New-Object WinSCP.TransferOptions -Property @{
    Transfermode = [WinSCP.TransferMode]::Binary
}
# create session object
$session = New-Object WinSCP.Session

try{
     # session starten
    $session.Open($options)
    # transfer files
    foreach($file in $files){
        try{
            $result = $session.PutFiles($file.Fullname,$remotepath,$false,$transoptions)
            $result.Check()
            $result
        }catch{
            write-host "Error: $($_.Exception.Message)" -ForegroundColor Red  
        }
    }
}catch{
    write-host "Error: $($_.Exception.Message)" -ForegroundColor Red  
}finally{
    $session.Close()
    $session.Dispose()
}

Gruß goldcap
tugsi76
tugsi76 Feb 05, 2025 at 18:27:31 (UTC)
Goto Top
Danke @151434,
lokal bei mir mal ausprobiert mit einem FTP-Server, klappt einwandfrei.
Habe noch das Logging mit eingebunden, damit man zumindestens am Anfang erkennt, ob alles glatt lief oder wo es vielleicht mal gehakt hat

    # Logfile anlegen
    $session.SessionLogPath = "C:\WinSCP\winscp.log"  
    # Logfile maximale Größe, danach wir rotiert .001, .002 
    $session.AddRawConfiguration("Logging\LogMaxSize", "1048576");  
    # maximale Anzahl an Logfiles, die angelegt werden, danach ältesten gelöscht
    $session.AddRawConfiguration("Logging\LogMaxCount", "30");  

Charme bei Deiner Lösung, ich muss nicht extra über ein Zwischenordner gehen.
Sehr schön, Danke Dir.