============================================================
TOPTORIALS OFFICE - Python Grundkurs
Teil 009: Projektordner mit Datum und Protokolldatei sichern
============================================================

Autor: Chris
Webseite: https://www.toptorials.com
YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
Skriptversion: Grundkurs 1.0
Stand dieser Anleitung: 12.09.2026


WICHTIG VOR DEM ERSTEN START
============================================================

Bitte zuerst mit Kopien unwichtiger Projektdateien arbeiten.

Für den Testmodus muss _test im tatsächlichen Dateinamen der
Starter-Batchdatei stehen. Der Hinweis im Kommentar der Datei
oder der Anzeigename einer Verknüpfung genügt dafür nicht.

Im Fenster muss stehen:

Testmodus: JA

Im Testmodus zeigt Python nur an, welche Ordner und Dateien
gesichert würden. Es werden keine Backupordner, keine Kopien
und keine Protokolldateien angelegt.

Ohne _test wird der Echtmodus gestartet. Der Backupordner wird
erst nach der Sicherheitsabfrage und der exakten Eingabe JA
angelegt.

Ein Backup im gleichen Projektordner und auf dem gleichen
Datenträger schützt nicht vor einem Defekt oder Verlust dieses
Datenträgers. Wichtige Daten sollten zusätzlich auf einem
anderen Datenträger oder an einem anderen sicheren Ort
gesichert werden.

Diese Lernskripte ersetzen keine vollständige, regelmäßig
geprüfte und räumlich getrennte Datensicherung.


INHALT
============================================================

01. Worum geht es?
02. Voraussetzungen
03. Ordner und Dateien
04. Schnellstart: normale Variante
05. SendTo-Variante einrichten und verwenden
06. Testmodus und Echtmodus
07. Speicherorte und Zeitstempel
08. Ordner- und Dateiausschlüsse
09. Backupplanung und Kopiervorgang
10. Protokolldatei
11. Ablauf und Bildschirmausgabe
12. Aufgaben der Starter-Batchdateien
13. Direkter Aufruf mit Python
14. Einstellungen anpassen
15. Rückgabecodes
16. Häufige Fragen und Fehler
17. Grenzen, Sicherheit und Zusammenfassung


01. WORUM GEHT ES?
============================================================

Mit diesen Skripten könnt ihr vollständige Projektordner in
einen neuen, datierten Backupordner kopieren.

Beispiel:

Quellordner:

C:\Projekte\MeinProjekt

Erzeugter Backupordner:

C:\Projekte\MeinProjekt\Backups\Backup_2026-09-12_18-30-45

Protokolldatei:

backup_protokoll_2026-09-12_18-30-45.log

Die Dateien und Unterordner des Projekts werden in den neuen
Backupordner kopiert. Leere Unterordner werden ebenfalls
angelegt.

Es gibt zwei Varianten:

- 02_Projektordner_sichern_mit_Log:
  Sichert den Ordner, in dem das Python-Skript liegt.

- 03_SendTo_Projektordner_sichern_mit_Log:
  Sichert einen oder mehrere Projektordner, die über das
  Windows-Menü "Senden an" übergeben wurden.

In jedem Quellordner entsteht ein eigener Unterordner mit dem
Namen Backups. Dieser Backup-Hauptordner wird vom Durchlauf
ausgeschlossen, damit vorhandene Sicherungen nicht erneut in
ein späteres Backup kopiert werden.

Beim Echtlauf entsteht in jedem neuen Backupordner eine eigene
UTF-8-Protokolldatei.


02. VORAUSSETZUNGEN
============================================================

- Windows für die Starter-Batchdateien und das SendTo-Menü.
- Eine installierte Version von Python 3.
- Der Python Launcher py oder alternativ der Befehl python.
- Ausreichende Lese- und Schreibrechte in den Projektordnern.
- Genügend freier Speicherplatz für die Sicherungen.
- Python-Skript und passender Starter liegen jeweils gemeinsam
  in ihrem Kursordner.

Mit diesen Befehlen könnt ihr die Installation prüfen:

py --version

oder:

python --version

Die Skripte verwenden ausschließlich Module aus der
Python-Standardbibliothek. Es müssen keine zusätzlichen Pakete
mit pip installiert werden.

Verwendete Module:

datetime
fnmatch
os
pathlib
shutil
sys


03. ORDNER UND DATEIEN
============================================================

Der vorgesehene Hauptordner lautet:

C:\TOPTORIALS_CODE\020_Python_Grundkurs\009_Backup_mit_Datum

Diese README.txt liegt im Hauptordner dieses Kurspakets.


Variante 1: normaler Projektordner
------------------------------------------------------------

Unterordner:

02_Projektordner_sichern_mit_Log

Python-Datei:

009_backup_mit_datum_mit_log.py

Starter für den Testmodus:

009_backup_mit_datum_mit_log_starter_batch_test.bat

Startername für den Echtmodus:

009_backup_mit_datum_mit_log_starter_batch.bat


Variante 2: SendTo
------------------------------------------------------------

Unterordner:

03_SendTo_Projektordner_sichern_mit_Log

Python-Datei:

009_sendto_backup_mit_datum_mit_log.py

Starter für den Testmodus:

009_sendto_backup_mit_datum_mit_log_starter_batch_test.bat

Startername für den Echtmodus:

009_sendto_backup_mit_datum_mit_log_starter_batch.bat


Hinweise zu den Dateinamen
------------------------------------------------------------

Die beiden genannten Starternamen pro Variante bezeichnen
denselben Starter vor beziehungsweise nach dem Umbenennen.
Es werden nicht zwingend zwei getrennte Starter benötigt.

Für den ersten Probelauf muss _test im tatsächlichen Namen
der Starter-Batchdatei stehen.

Die Python-Dateinamen müssen exakt zu den Namen passen, die im
jeweiligen Starter hinter py stehen.

Zusätze wie (1) oder (2), die beispielsweise beim erneuten
Herunterladen entstehen können, gehören nicht zu den oben
genannten Skriptnamen.


04. SCHNELLSTART: NORMALE VARIANTE
============================================================

1. Legt einen Projektordner mit Kopien unwichtiger Dateien
   und einigen Test-Unterordnern an.

2. Kopiert das Python-Skript der normalen Variante und seine
   Starter-Batchdatei gemeinsam in diesen Projektordner.

3. Prüft den Namen der Starter-Batchdatei. Für den Testlauf:

   009_backup_mit_datum_mit_log_starter_batch_test.bat

4. Startet diese Batchdatei per Doppelklick.

5. Prüft im Fenster:

   Testmodus: JA

6. Kontrolliert die angezeigten Pfade:

   Quelle
   Backup-Hauptordner
   Neuer Backupordner
   Protokolldatei

7. Prüft anschließend die angezeigten Ordner und Dateien sowie
   die Zähler am Ende der Vorschau.

8. Im Testmodus dürfen weder der Ordner Backups noch Dateien
   oder eine Protokolldatei angelegt werden.

9. Wenn die Vorschau stimmt, entfernt _test aus dem Namen
   einer Kopie der Starter-Batchdatei:

   009_backup_mit_datum_mit_log_starter_batch.bat

10. Startet den Echtmodus erneut.

11. Kontrolliert die neu erzeugte Vorschau noch einmal.

12. Bestätigt den Sicherungslauf nur bei korrekten Angaben
    mit der exakt großgeschriebenen Eingabe:

    JA

13. Prüft nach dem Lauf den neuen Backupordner und die darin
    angelegte Protokolldatei.

Wichtig:

Die normale Variante sichert immer den Ordner der zugehörigen
Python-Datei. Dafür verwendet sie:

Path(__file__).resolve().parent

Die README.txt sollte deshalb im Hauptordner des Kurspakets
bleiben. Sie muss für diese Variante nicht in den zu sichernden
Projektordner kopiert werden.


05. SENDTO-VARIANTE EINRICHTEN UND VERWENDEN
============================================================

Bei SendTo bleiben Python-Skript und Starter gemeinsam an
ihrem festen Speicherort:

C:\TOPTORIALS_CODE\020_Python_Grundkurs\009_Backup_mit_Datum\03_SendTo_Projektordner_sichern_mit_Log


Verknüpfung einrichten
------------------------------------------------------------

1. Prüft, dass der Original-Starter für den Probelauf so heißt:

   009_sendto_backup_mit_datum_mit_log_starter_batch_test.bat

2. Drückt Windows + R.

3. Gebt Folgendes ein:

   shell:sendto

4. Bestätigt mit Enter.

5. Legt in dem geöffneten SendTo-Ordner eine Verknüpfung zur
   Starter-Batchdatei an.

6. Die Original-Batchdatei und das Python-Skript bleiben
   gemeinsam im oben genannten Kursordner.

7. Gebt der Verknüpfung einen verständlichen Namen, etwa:

   Projektordner sichern - TEST

Wichtig:

Kopiert nicht nur die Starter-Batchdatei in den SendTo-Ordner.
Sie würde dort nach der Python-Datei im falschen Ordner suchen
und könnte das Skript deshalb nicht finden.


SendTo verwenden
------------------------------------------------------------

1. Markiert im Windows-Explorer einen oder mehrere Ordner.

2. Wählt im Kontextmenü "Senden an" und anschließend eure
   eingerichtete Test-Verknüpfung.

3. Prüft im Fenster:

   Testmodus: JA

4. Kontrolliert für jeden Plan die angezeigten Werte:

   Quelle
   Ziel
   Protokoll
   Anzahl der Ordner und Dateien

5. Prüft die Vorschau für alle übergebenen Projektordner.

Direkt übergebene Dateien werden übersprungen. Diese Variante
verarbeitet ausschließlich vorhandene Ordner.

Wird derselbe Ordner mehrfach übergeben, nimmt das Skript ihn
nur einmal in die Liste der Quellordner auf.

Alle gültigen Projektordner desselben Durchlaufs erhalten den
gleichen Zeitstempel. Jeder Quellordner besitzt jedoch seinen
eigenen Backup-Hauptordner und seine eigene Protokolldatei.


Auf Echtmodus umstellen
------------------------------------------------------------

Entfernt _test aus dem Namen einer Kopie der ORIGINAL-
Starter-Batchdatei:

009_sendto_backup_mit_datum_mit_log_starter_batch.bat

Erstellt anschließend eine neue SendTo-Verknüpfung zu diesem
Echtmodus-Starter oder aktualisiert das Ziel der vorhandenen
Verknüpfung.

Der Anzeigename der Verknüpfung steuert den Testmodus NICHT.
Entscheidend ist der tatsächliche Name der Batchdatei, auf die
die Verknüpfung verweist.

Nach dem erneuten Aufruf erscheint "Testmodus: NEIN".
Alle angezeigten Backups werden erst nach der exakten Eingabe
JA erstellt.


06. TESTMODUS UND ECHTMODUS
============================================================

Testmodus:
------------------------------------------------------------

- _test steht im Namen des Starters.
- Der Starter übergibt --test an Python.
- Das Skript zeigt "Testmodus: JA".
- Quelle, Ziel und Protokollpfad werden vorbereitet.
- Alle erlaubten Ordner und Dateien werden ermittelt.
- Der vollständige Backupplan wird angezeigt.
- Es entstehen keine Backupordner.
- Es werden keine Dateien kopiert.
- Es entstehen keine Protokolldateien.


Echtmodus:
------------------------------------------------------------

- _test fehlt im Namen des Starters.
- Der Starter übergibt kein --test.
- Das Skript zeigt "Testmodus: NEIN".
- Der Backupplan wird erneut vollständig erzeugt und angezeigt.
- Vor der Ausführung erscheint eine Sicherheitsabfrage.
- Nur die exakt geschriebene Eingabe JA wird akzeptiert.
- Erst danach werden Zielordner und Protokolldatei angelegt.
- Anschließend werden die vorbereiteten Dateien kopiert.

Die getestete Skriptversion unterscheidet bei der Bestätigung
zwischen Groß- und Kleinschreibung. Folgende Eingabe ist
richtig:

JA

Diese Varianten werden nicht akzeptiert:

ja
Ja
jA

Leerzeichen am Anfang und Ende werden durch strip() entfernt.
Eine andere oder leere Eingabe bricht vor dem Anlegen des
Backupordners ab.

Soll auch ein kleines ja akzeptiert werden, kann in beiden
Python-Skripten diese Zeile:

if antwort.strip() != "JA":

durch diese Variante ersetzt werden:

if antwort.strip().casefold() != "ja":


07. SPEICHERORTE UND ZEITSTEMPEL
============================================================

Der gemeinsame Name des Backup-Hauptordners lautet:

Backups

Der Zeitstempel wird mit diesem Format erstellt:

%Y-%m-%d_%H-%M-%S

Ein möglicher Wert lautet:

2026-09-12_18-30-45

Daraus bildet Python beispielsweise:

Backup_2026-09-12_18-30-45

und:

backup_protokoll_2026-09-12_18-30-45.log


Normale Variante
------------------------------------------------------------

Quelle:
Ordner des Python-Skripts.

Backup-Hauptordner:

<Skriptordner>\Backups

Neuer Zielordner:

<Skriptordner>\Backups\Backup_<Zeitstempel>


SendTo-Variante
------------------------------------------------------------

Quelle:
Jeder gültige, über den Explorer übergebene Projektordner.

Backup-Hauptordner:

<Ausgewählter Projektordner>\Backups

Neuer Zielordner:

<Ausgewählter Projektordner>\Backups\Backup_<Zeitstempel>

Die SendTo-Version legt das Backup NICHT im Ordner des Python-
Skripts an. Wenn dies dennoch geschieht, wurde wahrscheinlich
die normale Version statt der SendTo-Version gestartet.


08. ORDNER- UND DATEIAUSSCHLÜSSE
============================================================

Vorbereitete ausgeschlossene Ordnernamen:

Temp
Cache
Alte Dateien

Zusätzlich wird der vollständige Pfad dieses Ordners immer
ausgeschlossen:

<Quellordner>\Backups

Das verhindert, dass vorhandene Backups erneut in ein neues
Backup kopiert werden.

Vorbereitete ausgeschlossene Dateien und Dateimuster:

desktop.ini
thumbs.db
*.tmp
*.log
*.bak

Die Prüfung berücksichtigt die Groß- und Kleinschreibung nicht.
Deshalb werden zum Beispiel auch diese Namen ausgeschlossen:

THUMBS.DB
Bericht.LOG
Zwischenstand.BAK

Symbolische Dateilinks werden ebenfalls nicht kopiert.
Symbolische Verzeichnislinks und Windows-Junctions werden nicht
durchlaufen.

Die Ausschlüsse gelten an allen durchlaufenen Stellen des
Projektordners. Der spezielle Hauptordner Backups wird anhand
seines vollständigen Pfades direkt unter der jeweiligen Quelle
erkannt.


09. BACKUPPLANUNG UND KOPIERVORGANG
============================================================

Die Funktion backup_planen() durchläuft den Projektordner mit:

os.walk()

Dabei werden erlaubte Ordner und Dateien zunächst nur in Listen
gesammelt. Vor der Bestätigung wird noch nichts kopiert.

os.walk() verwendet in diesen Skripten unter anderem:

topdown=True
onerror=walk_fehler_ausloesen
followlinks=False

topdown=True sorgt dafür, dass ein Ordner geprüft wird, bevor
Python seine Unterordner betritt.

Mit:

unterordner[:] = erlaubte_unterordner

wird die von os.walk() bereitgestellte Liste direkt verändert.
Ausgeschlossene Unterordner werden dadurch anschließend nicht
mehr besucht.

Der vorbereitete Plan enthält vier Listen:

ordner
dateien
ausgeschlossene_ordner
ausgeschlossene_dateien

Beim Echtlauf legt mkdir() zuerst den neuen Backupordner und
anschließend die geplanten Unterordner an. Dadurch bleiben auch
leere Projektordner im Backup erhalten.

Dateien werden mit folgender Funktion kopiert:

shutil.copy2()

copy2() kopiert den Dateiinhalt und versucht zusätzlich,
Metadaten wie Änderungs- und Zugriffszeit zu übernehmen.
Abhängig vom Betriebssystem und Dateisystem können jedoch nicht
alle Metadaten vollständig erhalten bleiben.

Die Skripte verschieben oder löschen keine Quelldateien.


10. PROTOKOLLDATEI
============================================================

Die Protokolldatei entsteht nur im Echtmodus und liegt direkt
im neu erstellten Backupordner.

Sie wird mit UTF-8-Codierung zum Schreiben geöffnet:

logdatei.open("w", encoding="utf-8")

Der with-Block sorgt dafür, dass die geöffnete Datei nach dem
Schreiben automatisch geschlossen wird.

Die Funktion zeile_ausgeben_und_protokollieren() schreibt eine
Meldung gleichzeitig:

- in das Konsolenfenster und
- in die Protokolldatei.

Das Protokoll enthält unter anderem:

- Zeitstempel
- Quellpfad
- Zielpfad
- eingestellte Ordnerausschlüsse
- eingestellte Dateiausschlüsse und Dateimuster
- erfolgreich angelegte Unterordner
- erfolgreich kopierte Dateien
- Fehler beim Anlegen oder Kopieren
- Anzahl kopierter Dateien
- Anzahl ausgeschlossener Ordner und Dateien
- Anzahl der aufgetretenen Fehler

Die einzelnen Pfade der ausgeschlossenen Elemente werden nicht
alle separat ins Protokoll geschrieben. Festgehalten werden die
eingestellten Ausschlüsse und ihre Anzahl.

Eine Protokolldatei dokumentiert den Ablauf. Sie ist jedoch kein
Beweis dafür, dass jede kopierte Datei inhaltlich identisch und
langfristig lesbar ist. Die Skripte vergleichen keine
Prüfsummen.


11. ABLAUF UND BILDSCHIRMAUSGABE
============================================================

Normale Variante:
------------------------------------------------------------

1. Testmodus und Pfade vorbereiten.
2. Projektordner vollständig einlesen.
3. Erlaubte und ausgeschlossene Elemente sammeln.
4. Geplante Ordner und Dateien anzeigen.
5. Zähler ausgeben.
6. Im Testmodus ohne Schreibzugriff beenden.
7. Im Echtmodus die Eingabe JA abfragen.
8. Zielordner und Protokolldatei anlegen.
9. Unterordner erstellen und Dateien kopieren.
10. Zusammenfassung ausgeben und protokollieren.


SendTo-Variante:
------------------------------------------------------------

1. --test und alle Pfadargumente auswerten.
2. Ungültige Pfade, Dateien und Verknüpfungen überspringen.
3. Mehrfach übergebene Quellordner entfernen.
4. Für jede gültige Quelle einen eigenen Plan erstellen.
5. Alle Pläne vollständig anzeigen.
6. Im Testmodus ohne Schreibzugriff beenden.
7. Im Echtmodus einmal gemeinsam nach JA fragen.
8. Alle vorbereiteten Backups nacheinander ausführen.
9. Erfolgreiche und fehlgeschlagene Backups zusammenfassen.

Typische erfolgreiche Abschlussmeldung:

Backup erfolgreich abgeschlossen.
Backupordner: <vollständiger Zielpfad>
Protokoll:    <vollständiger Protokollpfad>


12. AUFGABEN DER STARTER-BATCHDATEIEN
============================================================

Die Starter-Batchdateien übernehmen mehrere Aufgaben:

1. setlocal DisableDelayedExpansion

   Begrenzt Änderungen an der Batch-Umgebung auf den aktuellen
   Starter und deaktiviert die verzögerte Variablenerweiterung.
   Ausrufezeichen in übergebenen Pfaden werden dadurch nicht als
   verzögerte Variablen ausgewertet.

2. chcp 65001

   Schaltet die Konsole auf die UTF-8-Codepage um.

3. cd /d "%~dp0"

   Wechselt in den Ordner der ausgeführten Batchdatei. /d
   ermöglicht bei Bedarf auch den Wechsel des Laufwerks.

4. %~n0

   Liefert den Namen der Batchdatei ohne Ordner und Endung.

5. find /i "_test"

   Sucht ohne Beachtung der Groß- und Kleinschreibung im eigenen
   Dateinamen nach _test.

6. if not errorlevel 1

   Prüft, ob find den Text gefunden hat. Bei einem Treffer wird
   --test an Python übergeben.

7. py

   Startet das Python-Skript über den Python Launcher.

8. %*

   Kommt nur im SendTo-Starter vor und reicht alle vom Explorer
   übergebenen Pfade an Python weiter.

9. pause

   Hält das Fenster nach dem Skriptlauf offen, damit Meldungen
   und mögliche Fehler gelesen werden können.

Falls py nicht funktioniert, enthalten beide Starter bereits
auskommentierte Alternativen mit dem Befehl python.


13. DIREKTER AUFRUF MIT PYTHON
============================================================

Die Starter-Batchdateien sind für den normalen Kursablauf
vorgesehen. Die Skripte können aber auch direkt in einer
Eingabeaufforderung gestartet werden.

Wechselt zuerst in den jeweiligen Skriptordner.


Normale Variante im Testmodus:
------------------------------------------------------------

py 009_backup_mit_datum_mit_log.py --test


Normale Variante im Echtmodus:
------------------------------------------------------------

py 009_backup_mit_datum_mit_log.py


SendTo-Variante im Testmodus:
------------------------------------------------------------

py 009_sendto_backup_mit_datum_mit_log.py --test "C:\Projekte\Projekt A" "C:\Projekte\Projekt B"


SendTo-Variante im Echtmodus:
------------------------------------------------------------

py 009_sendto_backup_mit_datum_mit_log.py "C:\Projekte\Projekt A" "C:\Projekte\Projekt B"

Pfade mit Leerzeichen müssen beim direkten Aufruf in
Anführungszeichen stehen.

Falls der Launcher py nicht verfügbar ist, kann je nach
Installation stattdessen python verwendet werden.


14. EINSTELLUNGEN ANPASSEN
============================================================

Der Name des Backup-Hauptordners steht in:

BACKUP_HAUPTORDNER = "Backups"

Ausgeschlossene Ordner stehen in diesem Tupel:

AUSGESCHLOSSENE_ORDNER = (
    "Temp",
    "Cache",
    "Alte Dateien",
)

Ausgeschlossene Dateien und Muster stehen hier:

AUSGESCHLOSSENE_DATEIEN = (
    "desktop.ini",
    "thumbs.db",
    "*.tmp",
    "*.log",
    "*.bak",
)

Weitere Einträge werden jeweils als zusätzliche Zeichenkette
mit einem nachfolgenden Komma ergänzt.

Beispiel für einen weiteren ausgeschlossenen Ordner:

AUSGESCHLOSSENE_ORDNER = (
    "Temp",
    "Cache",
    "Alte Dateien",
    "Vorschau",
)

Beispiel für ein weiteres Dateimuster:

AUSGESCHLOSSENE_DATEIEN = (
    "desktop.ini",
    "thumbs.db",
    "*.tmp",
    "*.log",
    "*.bak",
    "*.cache",
)

Nach jeder Anpassung sollte zuerst wieder ein Testlauf mit
"Testmodus: JA" durchgeführt werden.


15. RÜCKGABECODES
============================================================

Die Python-Skripte verwenden zwei grundlegende Rückgabecodes:

0 = Das Programm wurde regulär beendet.
1 = Es ist mindestens ein relevanter Fehler aufgetreten.

Auch ein vom Benutzer vor der Ausführung abgebrochener Lauf
endet regulär mit 0, weil dabei kein technischer Fehler
aufgetreten ist und nichts kopiert wurde.

Die normale Variante verwendet 1 beispielsweise bei einem
Lesefehler, einem nicht anlegbaren Zielordner oder mindestens
einem Fehler während des Kopiervorgangs.

Die SendTo-Version verwendet 1 unter anderem dann, wenn kein
gültiger Quellordner gefunden wurde, kein Backupplan erstellt
werden konnte oder mindestens ein Backup fehlgeschlagen ist.

Die Starter-Batchdateien zeigen diese Werte nicht gesondert an.
Durch pause bleibt jedoch die vorherige Python-Meldung sichtbar.


16. HÄUFIGE FRAGEN UND FEHLER
============================================================

Der Befehl py wurde nicht gefunden
------------------------------------------------------------

Prüft:

py --version

Falls Python nur über python erreichbar ist, aktiviert in der
Starter-Batchdatei die vorbereiteten alternativen Zeilen und
kommentiert die entsprechenden py-Aufrufe aus.


Das Python-Skript wurde nicht gefunden
------------------------------------------------------------

Python-Skript und Starter müssen im gleichen Ordner liegen.
Prüft außerdem den exakten Dateinamen im py-Aufruf.

Heruntergeladene Zusätze wie (1) oder (2) können dazu führen,
dass der im Starter eingetragene Name nicht mehr passt.


Der Starter zeigt Testmodus: NEIN
------------------------------------------------------------

Im tatsächlichen Dateinamen der Starter-Batchdatei fehlt _test.
Der Anzeigename einer SendTo-Verknüpfung ist dafür nicht
entscheidend.


Bei SendTo entsteht das Backup im Skriptordner
------------------------------------------------------------

Wahrscheinlich wurde die normale Python-Version gestartet.
Verwendet für SendTo ausschließlich:

009_sendto_backup_mit_datum_mit_log.py

mit dem dazugehörigen SendTo-Starter.


SendTo meldet, dass das Python-Skript nicht gefunden wurde
------------------------------------------------------------

Im SendTo-Ordner sollte nur eine Verknüpfung zur Batchdatei
liegen. Python-Skript und Original-Starter bleiben zusammen im
Kursordner. Eine allein nach SendTo kopierte Batchdatei sucht
die Python-Datei am falschen Speicherort.


Eine direkt übergebene Datei wird nicht gesichert
------------------------------------------------------------

Das ist beabsichtigt. Diese SendTo-Version verarbeitet nur
Ordner. Direkt übergebene Dateien werden als "Kein Ordner"
übersprungen.


Bestimmte Dateien fehlen im Backup
------------------------------------------------------------

Prüft die Einträge in AUSGESCHLOSSENE_DATEIEN. Die Muster
*.tmp, *.log und *.bak gelten ohne Beachtung der Groß- und
Kleinschreibung.

Prüft außerdem, ob es sich um einen symbolischen Dateilink
handelt. Solche Links werden nicht kopiert.


Bestimmte Ordner fehlen im Backup
------------------------------------------------------------

Prüft AUSGESCHLOSSENE_ORDNER. Zusätzlich werden der jeweilige
Backup-Hauptordner, symbolische Verzeichnislinks und Windows-
Junctions nicht durchlaufen.


Der Zielordner existiert bereits
------------------------------------------------------------

Der Zeitstempel enthält Sekunden. Der Fall ist deshalb selten,
kann aber bei sehr schnell gestarteten Läufen oder bei einem
vorbereiteten Ordner auftreten.

Ein vorhandener Zielordner wird nicht wiederverwendet und nicht
überschrieben. Der betreffende Sicherungslauf wird mit einer
Fehlermeldung beendet.


Einzelne Dateien können nicht kopiert werden
------------------------------------------------------------

Mögliche Ursachen:

- fehlende Zugriffsrechte
- Datei wird von einem anderen Programm gesperrt
- zu langer Pfad
- beschädigte Datei oder Datenträgerfehler
- fehlender Speicherplatz

Das Skript protokolliert den Fehler und versucht, die übrigen
Elemente weiterzuverarbeiten. Der Sicherungslauf wird am Ende
als fehlerhaft gemeldet.


Die Eingabe ja wird nicht akzeptiert
------------------------------------------------------------

Die getestete Version erwartet bewusst die exakt
großgeschriebene Eingabe JA. Die optionale casefold()-Variante
aus Abschnitt 06 erlaubt auch andere Groß-/Kleinschreibungen.


17. GRENZEN, SICHERHEIT UND ZUSAMMENFASSUNG
============================================================

Was diese Grundkurs-Version kann:
------------------------------------------------------------

- vollständige Projektordner einlesen
- datierte Backupordner anlegen
- Dateien und leere Unterordner kopieren
- vorbereitete Ordner und Dateimuster ausschließen
- vorhandene Backups vom nächsten Lauf ausschließen
- symbolische Links und Windows-Junctions auslassen
- echten Testmodus ohne Schreibzugriffe verwenden
- Echtlauf zusätzlich mit JA absichern
- eine UTF-8-Protokolldatei pro Backup erstellen
- mehrere Projektordner über SendTo verarbeiten
- mehrfach übergebene SendTo-Ordner nur einmal berücksichtigen


Was bewusst nicht enthalten ist:
------------------------------------------------------------

- keine Komprimierung der Backups
- keine Verschlüsselung
- keine automatische Löschung alter Sicherungen
- keine Aufbewahrungsstrategie
- keine inkrementellen oder differenziellen Backups
- kein Prüfsummenvergleich von Quelle und Kopie
- keine automatische Wiederherstellung
- kein separates Backupziel auf einem anderen Datenträger

Die normale Variante verwendet den Ordner ihrer Python-Datei
als Quelle. Die SendTo-Version erhält dagegen einen oder mehrere
Projektordner vom Windows-Explorer und erstellt in jedem dieser
Ordner ein eigenes Backup.

datetime.now().strftime() erzeugt einen gemeinsamen Zeitstempel.
Path setzt die benötigten Pfade zusammen. os.walk() durchläuft
den Projektordner, während Ausschlusslisten und die veränderte
Unterordnerliste verhindern, dass unerwünschte Bereiche besucht
werden.

Der vollständige Plan wird vor dem Kopieren angezeigt. Im
Testmodus endet das Skript danach ohne Änderungen. Im Echtmodus
legen mkdir() und shutil.copy2() die Zielstruktur und die
Dateikopien erst nach der Bestätigung mit JA an.

Die Protokolldatei dokumentiert Quelle, Ziel, Einstellungen,
Kopiervorgänge, Fehler und Zähler. Kontrolliert nach wichtigen
Sicherungsläufen trotzdem zusätzlich, ob die benötigten Dateien
im Backup vorhanden und lesbar sind.

Ihr wisst ja, die Nutzung dieses Codes erfolgt natürlich wieder
auf eigene Verantwortung. Ich übernehme keine Haftung für
Datenverluste, unbeabsichtigte Änderungen oder andere Schäden,
die durch die Verwendung des Skripts entstehen könnten.

============================================================
ENDE DER README
============================================================
