﻿============================================================
TOPTORIALS OFFICE – Python Grundkurs Teil 010
Zwei Ordner vergleichen und fehlende Dateien finden
============================================================

Autor: Chris
YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
Webseite: https://www.toptorials.com
Version: Grundkurs 1.0
Stand: 2026-09-16


1. WORUM GEHT ES?
============================================================

Die Skripte vergleichen Dateinamen aus zwei Ordnern in beide Richtungen.
Das Ergebnis zeigt, welche Namen im jeweils anderen Ordner fehlen.

Ihr könnt auswählen, ob die letzte Dateiendung berücksichtigt wird.
Das ist beispielsweise hilfreich, wenn ihr Originalbilder mit Exporten
oder Word-Dokumente mit dazugehörigen PDF-Dateien vergleichen möchtet.

Enthalten sind zwei Varianten:

- Feste Ordner: Die Vergleichspfade werden im Python-Skript eingetragen.
- SendTo: Genau zwei Ordner werden über das Windows-Menü „Senden an“
  an das Skript übergeben.

Verglichen werden ausschließlich Dateinamen, keine Dateiinhalte.
Dateigrößen, Änderungszeiten und Prüfsummen werden nicht geprüft.
Die Skripte synchronisieren keine Ordner und kopieren, verschieben,
benennen oder löschen keine Projektdateien.


2. VORAUSSETZUNGEN
============================================================

- Windows mit Python 3.
- Python-Launcher py, erreichbar über die Eingabeaufforderung.
- Leserechte für beide Vergleichsordner.
- Im Echtmodus Schreibrechte für die Ergebnisdateien.
- Python-Skript und zugehörige Starter-Batchdateien liegen nebeneinander.

Zusätzliche Python-Pakete werden nicht benötigt.
Die SendTo-Version verwendet das Windows-Programm clip.exe für die
Zwischenablage.

Die Starter verwenden:

py -3 -X utf8

Falls auf eurem Rechner nur der Befehl python verfügbar ist, ersetzt
in den betreffenden Starter-Batchdateien „py -3“ durch „python“.
Die Option „-X utf8“ bleibt erhalten.


3. ORDNER UND DATEIEN
============================================================

Entpackt den Kursordner nach:

C:\TOPTORIALS_CODE\020_Python_Grundkurs

Danach ergibt sich folgende Struktur:

010_Fehlende_Dateien_vergleichen

  01_Feste_Ordner_vergleichen
    010_fehlende_dateien_vergleichen.py
    010_fehlende_dateien_vergleichen_starter_batch_test.bat
    010_fehlende_dateien_vergleichen_starter_batch.bat

  02_SendTo_Zwei_Ordner_vergleichen
    010_sendto_zwei_ordner_vergleichen.py
    010_sendto_zwei_ordner_vergleichen_starter_batch_test.bat
    010_sendto_zwei_ordner_vergleichen_starter_batch.bat

Die beiden Starter einer Variante haben denselben Inhalt.
Nur der Dateiname unterscheidet sich und steuert den Modus.

Diese README.txt gehört in den Hauptordner:

C:\TOPTORIALS_CODE\020_Python_Grundkurs\010_Fehlende_Dateien_vergleichen

Das ursprüngliche Skriptpaket enthält zusätzlich TESTHINWEISE.txt
mit einer kompakten Anleitung für die ersten Durchläufe.


4. TESTMODUS UND ECHTMODUS
============================================================

Mit _test im tatsächlichen Namen der Starter-Batchdatei:

- Der Starter übergibt --test an Python.
- Im Fenster erscheint „Testmodus: JA“.
- Die Ordner werden verglichen und die Ergebnisse angezeigt.
- Es werden keine Ergebnisdateien erstellt.
- SendTo aktualisiert trotzdem die Zwischenablage mit beiden Berichten.

Ohne _test im tatsächlichen Namen der Starter-Batchdatei:

- Im Fenster erscheint „Testmodus: NEIN“.
- Zusätzlich zur Anzeige werden Ergebnisdateien gespeichert.
- SendTo aktualisiert ebenfalls die Zwischenablage.

Wichtig: Der Anzeigename einer SendTo-Verknüpfung steuert den Modus nicht.
Entscheidend ist der Name der echten Batchdatei, auf die sie verweist.

Die Frage „Dateiendung berücksichtigen? JA/NEIN“ ist keine zusätzliche
Sicherheitsbestätigung. Sie entscheidet ausschließlich über die Endung.
Im Echtmodus werden die Berichte nach dem Vergleich direkt gespeichert.


5. VERGLEICH MIT ODER OHNE DATEIENDUNG
============================================================

JA:
Der vollständige Dateiname wird verglichen.

Beispiel:
Bild_001.CR3 und Bild_001.jpg gelten als unterschiedliche Namen.

NEIN:
Der Name ohne die letzte Dateiendung wird verglichen.

Beispiel:
Bild_001.CR3 und Bild_001.jpg ergeben beide den Namen Bild_001.

Weitere Beispiele:

- Bericht.docx und Bericht.pdf passen ohne Endung zusammen.
- Bericht.final.pdf wird ohne Endung zu Bericht.final.
- Normale Dateien ohne Dateiendung werden ebenfalls berücksichtigt.

Leerraum vor und nach der Eingabe wird entfernt. Groß-/Kleinschreibung
spielt bei der Eingabe keine Rolle: ja, JA, nein und NEIN funktionieren.
Andere Antworten beenden den Durchlauf mit einer Fehlermeldung.

Die Vergleichsschlüssel werden mit casefold() vorbereitet. Dadurch wird
Groß-/Kleinschreibung beim Namensvergleich ignoriert. Die ursprüngliche
Schreibweise bleibt für die Ausgabe erhalten.

Bei bestimmten Unicode-Sonderfällen kann casefold() andere Ergebnisse
liefern als der PowerShell-Vergleich. Die üblichen Kursbeispiele
verhalten sich gleich.


6. NORMALE VARIANTE EINRICHTEN UND STARTEN
============================================================

Öffnet:

010_fehlende_dateien_vergleichen.py

Kontrolliert die Einstellungen TESTBEREICH, ORDNER1 und ORDNER2.
Vorbereitet ist dieser Hauptpfad der Testumgebung:

C:\TOPTORIALS_CODE\1000_TESTBEREICH\TOPTORIALS_Testdaten_Windows_Automatisierung_Python_V001

Darunter erwartet das Skript:

010_Fehlende_Dateien_vergleichen\01_Feste_Ordner_vergleichen\01_Ordner_1
010_Fehlende_Dateien_vergleichen\01_Feste_Ordner_vergleichen\02_Ordner_2

Wenn eure Ordner anders heißen oder an einem anderen Ort liegen,
passt die Einstellungen an. Die Vergleichsordner müssen bereits
vorhanden sein; das Skript erstellt sie nicht selbst.

Alternativ könnt ihr direkt vollständige Pfade eintragen:

ORDNER1 = Path(r"C:\Test\Ordner_1")
ORDNER2 = Path(r"C:\Test\Ordner_2")

Ihr könnt auch vorhandene PowerShell-Testordner verwenden, wenn ihr
deren tatsächliche Pfade eintragt.

Ablauf:

1. Startet 010_fehlende_dateien_vergleichen_starter_batch_test.bat.
2. Kontrolliert den Testmodus und die beiden angezeigten Pfade.
3. Gebt JA oder NEIN für die Dateiendung ein.
4. Prüft die angezeigten fehlenden Namen und die Zusammenfassung.
5. Für einen gespeicherten Bericht startet ihr anschließend die
   Starter-Batchdatei ohne _test im Namen.

Die Ergebnisdatei landet neben der Python-Datei:

vergleich_ergebnis_JJJJ-MM-TT_HH-MM-SS.txt

Beispiel:

vergleich_ergebnis_2026-09-16_14-30-00.txt

Dieser Bericht enthält beide Vergleichsrichtungen.
Der Ablageort hängt nicht vom aktuellen Arbeitsverzeichnis ab.


7. SENDTO EINRICHTEN UND STARTEN
============================================================

Python-Skript und beide SendTo-Starter bleiben gemeinsam hier:

C:\TOPTORIALS_CODE\020_Python_Grundkurs\010_Fehlende_Dateien_vergleichen\02_SendTo_Zwei_Ordner_vergleichen

1. Erstellt Verknüpfungen zu den beiden SendTo-Starter-Batchdateien.
2. Gebt in der Adresszeile des Windows-Explorers Folgendes ein:

   shell:sendto

3. Verschiebt die Verknüpfungen in den geöffneten SendTo-Ordner.
4. Markiert genau zwei unterschiedliche Vergleichsordner.
5. Wählt Rechtsklick – Senden an – die gewünschte Verknüpfung.
   Je nach Windows-Menü erreicht ihr „Senden an“ über
   „Weitere Optionen anzeigen“.
6. Beginnt mit der Testvariante und kontrolliert die angezeigten Pfade.
7. Gebt JA oder NEIN für die Dateiendung ein.

Wichtig: Nicht nur die Batchdateien selbst nach shell:sendto kopieren.
Der Starter erwartet das Python-Skript direkt neben sich. Deshalb werden
Verknüpfungen zu den echten Starterdateien verwendet.

Als Vergleichsziele erwartet das Skript echte Dateisystemordner.
Windows-Verknüpfungen zu Ordnern (.lnk) werden nicht aufgelöst.
Für die gemeinsame Auswahl im Explorer verwendet ihr am einfachsten
zwei Ordner im selben übergeordneten Verzeichnis.

Die Reihenfolge der übergebenen Ordner bestimmt die Bezeichnungen
Ordner 1 und Ordner 2. Weil in beide Richtungen verglichen wird,
erhaltet ihr unabhängig davon beide Fehlstellenlisten.


8. SENDTO-BERICHTE UND ZWISCHENABLAGE
============================================================

Im Echtmodus erhält jeder ausgewählte Ordner eine eigene Datei:

vergleich_fehlt_hier_JJJJ-MM-TT_HH-MM-SS.txt

Beispiel:

C:\Test\Ordner_A\vergleich_fehlt_hier_2026-09-16_14-30-00.txt
C:\Test\Ordner_B\vergleich_fehlt_hier_2026-09-16_14-30-00.txt

Jeder Bericht nennt die Namen, die in seinem eigenen Ordner fehlen.
Die Dateien werden nicht im SendTo-Skriptordner abgelegt.

Die Zwischenablage enthält beide Berichte, getrennt durch eine Linie.
Ihr könnt den Text zum Beispiel mit Strg+V in einen Texteditor einfügen.
Das funktioniert auch im Testmodus und ersetzt den bisherigen Inhalt
der Zwischenablage.

Falls clip.exe nicht gestartet werden kann oder einen Fehler meldet,
erscheint ein Hinweis. Der Vergleich und das mögliche Speichern der
Berichte können trotzdem weiterlaufen.


9. WELCHE DATEIEN WERDEN BERÜCKSICHTIGT?
============================================================

- Nur direkt in den Vergleichsordnern enthaltene Dateien.
- Auch versteckte Dateien werden berücksichtigt.
- Unterordner werden nicht rekursiv durchsucht.
- Es gibt keinen pauschalen Ausschluss von .py, .bat oder anderen Endungen.

Die SendTo-Version schließt allerdings Namen nach diesem Muster aus:

vergleich_fehlt_hier_*.txt

Dadurch beeinflussen frühere Vergleichsberichte den nächsten Durchlauf
nicht. Der Filter prüft nur den Dateinamen, nicht den Ersteller der Datei.
Auch eine selbst erstellte Datei mit einem passenden Namen wird deshalb
ausgeschlossen.

In der normalen Variante ist dieser Berichtsausschluss deaktiviert.
Wenn ihr dort den Skriptordner selbst als Vergleichsordner eintragt,
werden auch die darin enthaltenen Skripte und alten Berichte mitgezählt.

Die Dateisystemprüfungen können symbolischen Links folgen. Diese Fassung
ist kein Werkzeug zur gesonderten Analyse von Links oder Verknüpfungen.


10. DATEIANZAHL UND FEHLENDE NAMEN
============================================================

Die Berichte unterscheiden zwischen:

- Anzahl eingelesener Dateien.
- Anzahl fehlender eindeutiger Vergleichsnamen.

Beispiel:
Ein Ordner enthält Bild.jpg und Bild.png. Das sind zwei Dateien.
Ohne Dateiendung ergeben beide den Vergleichsnamen Bild.
Fehlt dieser Name im anderen Ordner, wird ein fehlender Name gemeldet.

Gleiche Vergleichsschlüssel werden im Dictionary nur einmal gespeichert.
Die ursprüngliche Schreibweise des ersten erfassten Namens bleibt dabei
erhalten. Die Quelldateien selbst werden nicht umbenannt.


11. PROGRAMMAUFBAU
============================================================

Die Funktionen verteilen die Arbeit auf überschaubare Aufgaben:

main()
Steuert Argumentprüfung, Eingabe, Vergleich, Ausgabe und Speichern.

dateien_einlesen(ordner, berichte_ausschliessen=False)
Liest und sortiert die Dateien. Der zweite Parameter ist optional.
Ohne zweites Argument gilt False. SendTo übergibt ausdrücklich True.

namen_sammeln(dateien, mit_endung)
Erstellt ein Dictionary mit Vergleichsschlüsseln und ursprünglichen Namen.

bericht_speichern(pfad, zeilen)
Schreibt die Berichtszeilen als UTF-8-Textdatei mit Überschreibschutz.

Zusätzlich bei SendTo:

bericht_erstellen(...)
Erstellt die Berichtszeilen für einen Ordner. Für die Gegenrichtung wird
dieselbe Funktion mit vertauschten Ordnern und passenden Zählern aufgerufen.

zwischenablage_kopieren(text)
Übergibt den Berichtstext über clip.exe an die Windows-Zwischenablage.

Der Startblock lautet:

if __name__ == "__main__":
    sys.exit(main())

Bei direktem Start wird main() ausgeführt. Erst danach erhält sys.exit()
deren Rückgabewert. Beim Import als Modul wird dieser Startblock
übersprungen; die enthaltenen Funktionen lassen sich dadurch wiederverwenden.

0 bedeutet hier eine erfolgreiche Verarbeitung, 1 einen behandelten Fehler.
Ein gesondert behandelter Zwischenablagefehler führt allein nicht zu 1.


12. BERICHTE UND ÜBERSCHREIBSCHUTZ
============================================================

Die Berichte werden in UTF-8 gespeichert.
Der Zeitstempel verwendet die lokale Zeit des Rechners.

Der Dateimodus "x" erstellt ausschließlich neue Dateien. Existiert bereits
ein Bericht mit genau demselben Namen, wird er nicht überschrieben.
Stattdessen erscheint eine Fehlermeldung.

Da der Zeitstempel Sekunden enthält, können zwei Durchläufe innerhalb
derselben Sekunde denselben Berichtsnamen erzeugen.

SendTo schreibt die Berichte nacheinander. Falls das Schreiben im zweiten
Ordner fehlschlägt, bleibt ein bereits erfolgreich gespeicherter erster
Bericht bestehen. Es erfolgt kein automatisches Zurückrollen.


13. KURZER TESTABLAUF
============================================================

Bereitet zwei Ordner mit diesen Dateien vor:

Ordner A:
Datei_001.txt
Datei_002.txt
Datei_003.pdf
Export_001.jpg

Ordner B:
Datei_001.txt
Datei_003.pdf
Datei_004.txt
Export_001.png

Erwartung mit JA:

- In Ordner A fehlen Datei_004.txt und Export_001.png.
- In Ordner B fehlen Datei_002.txt und Export_001.jpg.
- In jedem Ordner werden vier Dateien eingelesen.

Erwartung mit NEIN:

- In Ordner A fehlt Datei_004.
- In Ordner B fehlt Datei_002.
- Export_001 ist in beiden Ordnern als Vergleichsname vorhanden.

Prüft außerdem:

1. Im Testmodus entstehen keine neuen Berichtdateien.
2. Im Echtmodus stimmen die oben beschriebenen Ablageorte.
3. SendTo liefert beide Berichte über Strg+V in einen Editor.
4. Vorhandene SendTo-Berichte werden beim erneuten Vergleich ausgeschlossen.
5. Ein zusätzlicher Unterordner wird nicht durchsucht.
6. Gleiche Namen mit unterschiedlicher Groß-/Kleinschreibung passen zusammen.


14. HÄUFIGE PROBLEME
============================================================

„py“ wird nicht gefunden:
Python-Launcher prüfen oder den Starter wie unter Voraussetzungen anpassen.

Python-Datei wird nicht gefunden:
Dateiname und Speicherort prüfen. Python-Datei und Starter müssen
nebeneinander liegen. Bei SendTo Verknüpfungen zu den Startern verwenden.

Ordner nicht gefunden:
TESTBEREICH, ORDNER1 und ORDNER2 kontrollieren. Die Vergleichsordner werden
nicht automatisch angelegt.

Bitte genau zwei Ordner übergeben:
Es wurden zu wenige oder zu viele Argumente übergeben. Genau zwei Ordner
markieren und die SendTo-Variante verwenden.

Kein Dateisystemordner:
Mindestens ein übergebener Pfad ist kein gültiger Ordner. Auch eine
.lnk-Datei ist für dieses Skript kein Vergleichsordner.

Bitte zwei unterschiedliche Ordner auswählen:
Beide Pfade zeigen auf denselben Dateisystemordner.

Keine Ergebnisdatei:
Im Testmodus ist das vorgesehen. Für das Speichern den echten Starter
ohne _test verwenden. Andernfalls die Fehlermeldung und Schreibrechte prüfen.

Zwischenablage konnte nicht aktualisiert werden:
Den angezeigten Hinweis prüfen. Die Bildschirmausgabe und gegebenenfalls
gespeicherte Berichte können weiterhin verwendet werden.

Gleichnamiger Bericht existiert bereits:
Der Überschreibschutz hat gegriffen. Vorhandene Berichte bleiben erhalten.
Ein neuer Durchlauf zu einem späteren Zeitpunkt erhält einen neuen Zeitstempel.


15. SICHERHEITSHINWEIS
============================================================

Verwendet für erste Versuche Kopien unwichtiger Dateien und kontrolliert
die angezeigten Ordnerpfade. SendTo ersetzt auch im Testmodus den Inhalt
der Zwischenablage.

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.

Viel Spaß beim Ausprobieren.
Chris – TOPTORIALS OFFICE
