FTP-Backup mit PowerShell, ncFTP und 7-Zip

powershell_logoDas folgende Skript lädt alle Dateien von einem FTP Server herunter und fügt sie zu einem ZIP-Archiv zusammen. Für den FTP-Download wird ncFTP verwendet, da die in Windows integrierte FTP.exe nicht für den Download ganzer Verzeichnis-Hierarchien geeignet ist. Das Komprimieren der Dateien übernimmt 7-Zip.

Damit das Skript funktioniert müssen die Daten im Configuration Part des Skriptes angepasst werden. Um das Skript auszuführen wird die Windows PowerShell benötigt. Information zum Ausführen von PowerShell Skripten gibt es hier. Am Ende des Artikels gibt es einen Downloadlink für das Skript mit allen Binaries.

# BackUP files from FTP Server as ZIP
# Author: Marcus Hottenrott
# GNU GPL
#
#--- Configuration ------------------------------------------

$backupDestination = "D:\FTP_Backup\Backup"
$pathToThisScript = "D:\FTP_Backup"

$ftpHost = "localhost"
$ftpUser = "USERNAME"
$ftpPassword = "PASSWORD"
$ftpFolderToBackUp = "/"
$ftpPort = "21"


#--- Implementation ------------------------------------------

# Path to binaries
Set-Location $pathToThisScript
$sevenZipPath = Get-Item "bin\7z.exe" | Resolve-Path -Relative
$ncFtpGetPath = Get-Item "bin\ncftpget.exe" | Resolve-Path -Relative

# Backup filename
$backUpZipFileName = Get-Date -Format "yyyy-MM-dd-HH_mm_ss"
$BackupZIP = $backupDestination + "\" + $backUpZipFileName

# Create temp folder for downloaded FTP files
$tempFolderForFtpFiles = $env:temp + "\FTP_Backup"
New-Item -Path $tempFolderForFtpFiles -ItemType directory

# Download files from FTP Server
Start-Process  -FilePath $ncFtpGetPath -ArgumentList "-T -R -v -u $ftpUser -p $ftpPassword -P $ftpPort $ftpHost $tempFolderForFtpFiles $ftpFolderToBackUp" -wait

# Zip downloaded files
Start-Process  -FilePath $sevenZipPath -ArgumentList "a -Tzip $BackupZIP $tempFolderForFtpFiles" -wait

# Delete temp folder
Remove-Item -Recurse -Force -Path $tempFolderForFtpFiles

Download Skript

[wpdm_file id=4]

PowerShell Skripte ausführen

Die Windows PowerShell ist eine Alternative zum Windows-Kommandozeilenprogramm cmd.exe und zum Windows Script Host, die mit Windows 7 eingeführt wurde. Für Windows XP kann die PowerShell nachinstalliert werden. Ab Version 2.0 basiert die PowerShell auf dem .NET-Framework und verbindet die aus Unix-Shells bekannte Philosophie von Pipes und Filtern mit dem Paradigma der objektorientierten Programmierung. Mittels der PowerShell Scripting Language können komplexe Skripte erstellt werden. Die Skripte besitzen die Dateierweiterung *.ps1. Microsoft liefert mit PowerShell ISE einen grafischen Editor zum leichteren Erstellen der Skripte mit. (In Windows einfach nach PowerShell suchen)

PowerShell_ISE

Beim ersten Ausführen treten allerdings auch die ersten Hürden auf. Bei einem Doppelklick auf ein PowerShell Skript wird dieses nicht ausgeführt, sondern es öffnet sich Notepad. Macht man einen Rechtsklick auf das Skript und wählt „Mit PowerShell ausführen“ so wird die Skriptausführungs durch die standardmäßig sehr restriktive Execution Policy der PowerShell verhindert. Im Nachfolgenden wird für beide Probleme eine Lösung aufgezeigt:

Execution Policy

Die Execution Policy verhindert in der Standardeinstellung die Ausführung von Skripten. Detaillierte Informationen finden sich bei Microsoft. Für Testzwecke kann die PowerShell so konfiguriert werden das sie alle Skripte ausführt. Dazu führt man die PowerShell als Administrator aus. (z.B. Windowssuche -> PowerShell -> Rechtsklick als Administrator ausführen). In der PowerShell kann dann mit dem folgendem Befehl die Ausführung der Skripte freigeschaltet werden:

Set-ExecutionPolicy Unrestricted

PowerShellAktivieren

PowerShell Skript mit Doppelklick ausführen

Um ein PowerShell Skript per Klick starten zu können muss eine Verknüpfung erstellt werden, die powershell.exe mit dem auszuführenden Skript startet:

powershell.exe -Command "& 'C:\helloworld.ps1'"