Unter Windows wird SFTP erst mal nicht unterstützt. Eine Möglichkeit ist ein PowerShell-Skipt welches mit WinSCP übertragen wird.
Voraussetzung:
- WinSCP installieren: Lade WinSCP herunter und installiere es.
- WinSCP .NET Assembly: Die Datei WinSCPnet.dll muss vorhanden sein. Standardpfad: C:\Program Files (x86)\WinSCP\WinSCPnet.dll
- SSH Host Key Fingerprint: Den Fingerprint des SFTP-Servers erhältst du mit WinSCP (Verbindungsversuch und Fingerprint anzeigen lassen).
Beispiel für das Skipt:
$ftpServer = "ftp://dein-ftp-server.com" # FTP-Server-Adresse
$ftpUser = "dein-benutzername" # FTP-Benutzername
$ftpPass = "dein-passwort" # FTP-Passwort
$remotePath = "/pfad/zur/datei.txt" # Pfad zur Datei auf dem FTP-Server
$localPath = "C:\Pfad\zur\Speicherung\datei.txt" # Lokaler Speicherort
$webClient = New-Object System.Net.WebClient
$webClient.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPass)
try {
$webClient.DownloadFile("$ftpServer$remotePath", $localPath)
Write-Host "Download erfolgreich: $localPath"
} catch {
Write-Host "Fehler beim Download: $_"
} finally {
$webClient.Dispose()
}
2. Beispiel mehrerer Dateien sollen heruntergeladen werden. Und in Unterschiedliche Ordner abgelegt werden. Und eventuell soll ein Datum angehängt werden
# WinSCP .NET Assembly laden
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "sftp-server.com"
UserName = "dein-benutzername"
Password = "dein-passwort"
SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:..."
}
$session = New-Object WinSCP.Session
try {
$session.Open($sessionOptions)
# Liste der Dateien mit lokalen Ordnern & Kennzeichnung, ob das Datum angefügt werden soll
$fileMappings = @(
@{ RemoteFile = "/remote/pfad/erste_datei.txt"; LocalFolder = "C:\LokalerOrdner1"; AddDate = $false },
@{ RemoteFile = "/remote/pfad/zweite_datei.txt"; LocalFolder = "C:\LokalerOrdner2"; AddDate = $true }, # Diese Datei bekommt das Datum vorne
@{ RemoteFile = "/remote/pfad/dritte_datei.txt"; LocalFolder = "C:\LokalerOrdner3"; AddDate = $false }
)
foreach ($file in $fileMappings) {
# Datei-Name extrahieren
$fileName = [System.IO.Path]::GetFileName($file.RemoteFile)
# Falls AddDate = $true ist, das Datum vorne einfügen
if ($file.AddDate) {
$datum = Get-Date -Format "yyyy-MM-dd"
$fileName = "$datum`_$fileName" # Datum vorne einfügen
}
# Lokalen Ordner prüfen/erstellen
if (!(Test-Path -Path $file.LocalFolder)) {
New-Item -ItemType Directory -Path $file.LocalFolder | Out-Null
}
# Zielpfad definieren
$localPath = "$($file.LocalFolder)\$fileName"
# Datei herunterladen
$session.GetFiles($file.RemoteFile, $localPath).Check()
Write-Host "Download erfolgreich: $localPath"
}
}
catch {
Write-Host "Fehler beim Download: $_"
}
finally {
$session.Dispose()
}
Das Skipt über die Windows Aufgabe ausführen
Aufgabenplanung öffnen
- Windows-Taste + R drücken, taskschd.msc eingeben und mit Enter bestätigen.
- Klicke auf „Aufgabe erstellen…“ (nicht „Einfache Aufgabe erstellen“).
Aufgabe konfigurieren
Allgemein
- Name: SFTP-Download
- Benutzerkonto: Wähle ein Konto mit ausreichend Rechten.
- Option aktivieren: Mit höchsten Privilegien ausführen
Trigger (Zeitplan einstellen)
- Neuen Trigger hinzufügen (z. B. täglich oder alle X Minuten).
Aktion (Skript ausführen)
- Aktion: Programm starten
- Programm/Skript: powershell.exe
- Argument hinzufügen: -ExecutionPolicy Bypass -File „C:\Skripte\sftp_download.ps1“