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
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
Please also mark the comments that contributed to the solution of the article
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
4 Comments
Latest comment
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.
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:
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.
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.
Source: AI
Copy-Schleife via ChatGPT generiert

WinSCP quick n dirty mit der WinSCP.com
Oder bei WinSCP dann doch besser zur .NET DLL oder Modul greifen da hat man mehr Kontrolle, hier n' Beispiel mit nem SFTP Server:
Gruß goldcap
$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