TOPTORIALS OFFICE - Python Grundkurs
Script: 003_Dateiliste_erstellen
Autor: Chris
YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
Webseite: https://www.toptorials.com
Letzte Aktualisierung: 2026-07-30

============================================================

1. # Was macht dieses Script?

Dieses Script erstellt automatisch eine Dateiliste mit Python.

Es gibt zwei Varianten:

01_Einfach
02_SendTo_Dateiliste_erstellen

Die erste Variante erstellt eine Dateiliste aus dem aktuellen Ordner.
Das Script wird dazu zusammen mit der Starter-Batchdatei in den
gewünschten Ordner kopiert und dort gestartet.

Die zweite Variante ist eine SendTo-Version. Damit können Dateien oder
Ordner im Windows-Explorer markiert und über "Senden an" an das Script
übergeben werden.

Die fertige Liste kann:

* in eine Textdatei geschrieben werden
* in die Zwischenablage kopiert werden
* oder beides gleichzeitig

Dieses Script löscht keine Dateien und verändert keine vorhandenen
Dateien. Es liest Dateien und Ordner aus, erstellt eine Textdatei und
schreibt die Liste zusätzlich in die Zwischenablage.

============================================================
2. Enthaltene Ordner und Dateien
================================

01_Einfach
003_dateiliste_erstellen.py
003_dateiliste_erstellen_starter_batch.bat

02_SendTo_Dateiliste_erstellen
003_sendto_dateiliste_erstellen.py
003_sendto_dateiliste_erstellen_starter_batch.bat

============================================================
3. Variante 1: 01_Einfach
=========================

Die einfache Variante befindet sich im Ordner:

01_Einfach

Darin liegen diese Dateien:

003_dateiliste_erstellen.py
003_dateiliste_erstellen_starter_batch.bat

Die Python-Datei enthält die eigentliche Logik.

Die Starter-Batchdatei startet Python und führt das Python-Script aus.

Empfohlener Start:

003_dateiliste_erstellen_starter_batch.bat

Diese Datei kann per Doppelklick gestartet werden.

Die Dateiliste wird aus dem Ordner erstellt, in dem die Starter-
Batchdatei liegt.

Die Ausgabe erfolgt standardmäßig in:

dateiliste.txt

Zusätzlich wird der Inhalt der Liste in die Zwischenablage kopiert.

============================================================
4. Variante 2: 02_SendTo_Dateiliste_erstellen
=============================================

Die SendTo-Variante befindet sich im Ordner:

02_SendTo_Dateiliste_erstellen

Darin liegen diese Dateien:

003_sendto_dateiliste_erstellen.py
003_sendto_dateiliste_erstellen_starter_batch.bat

Diese Variante ist für den praktischen Workflow im Windows-Explorer
gedacht.

Damit können Dateien oder Ordner markiert und über "Senden an" an das
Script übergeben werden.

Typischer Ablauf:

1. Im Explorer Dateien oder Ordner markieren
2. Rechtsklick auf die markierten Elemente
3. Senden an
4. SendTo-Starter-Batchdatei auswählen
5. Python erstellt daraus eine Dateiliste
6. Die Liste wird als Textdatei gespeichert und in die Zwischenablage kopiert

Die Ausgabe erfolgt standardmäßig in:

dateiliste_sendto.txt

============================================================
5. SendTo-Verknüpfung einrichten
================================

Damit die SendTo-Variante über das Kontextmenü genutzt werden kann,
muss eine Verknüpfung zur Starter-Batchdatei im SendTo-Ordner von
Windows abgelegt werden.

Den SendTo-Ordner öffnen:

Windows-Taste + R

Dann eingeben:

shell:sendto

Danach Enter drücken.

In diesen Ordner kann eine Verknüpfung zu folgender Datei gelegt
werden:

003_sendto_dateiliste_erstellen_starter_batch.bat

Danach erscheint diese Verknüpfung im Windows-Explorer unter:

Rechtsklick auf Dateien oder Ordner
Senden an

============================================================
6. Warum gibt es eine Starter-Batchdatei?
=========================================

Die Python-Logik steht in der .py-Datei.

Die Batchdatei startet nur Python und ruft das passende Python-Script
auf.

Das hat mehrere Vorteile:

* Python wird gezielt gestartet
* die passende .py-Datei wird automatisch gefunden
* der Start ist für Einsteiger einfacher
* das Fenster bleibt sichtbar
* Fehlermeldungen bleiben sichtbar
* der aktuelle Arbeitsordner wird sauber gesetzt
* der Aufbau bleibt über die Kursteile hinweg einheitlich
* über SendTo können Dateien und Ordner bequem übergeben werden

Die Starter-Batchdatei nutzt dazu zum Beispiel:

py "003_dateiliste_erstellen.py"

Falls der Python Launcher py nicht funktioniert, ist zusätzlich eine
Alternative mit python vorbereitet:

python "003_dateiliste_erstellen.py"

============================================================
7. Wichtige Begriffe der einfachen Variante
===========================================

## from pathlib import Path

Mit dieser Zeile wird Path aus dem Modul pathlib importiert.

pathlib ist in Python für Datei- und Ordnerpfade zuständig.

Path ermöglicht es, Pfade nicht nur als Text zu behandeln, sondern als
Path-Objekte.

Ein Path-Objekt besitzt nützliche Eigenschaften und Methoden, zum
Beispiel:

name
exists()
is_file()
is_dir()
iterdir()
rglob()
resolve()
relative_to()
write_text()

## import subprocess

subprocess wird verwendet, wenn Python ein externes Programm starten
soll.

In diesem Script wird damit das Windows-Programm clip gestartet, um Text
in die Zwischenablage zu kopieren.

## ausgabe_datei

ausgabe_datei ist eine Variable.

In der einfachen Variante enthält sie:

dateiliste.txt

Dieser Name wird später verwendet, wenn die Textdatei geschrieben wird.

## basis_ordner = Path.cwd()

Path.cwd() liefert den aktuellen Arbeitsordner.

cwd steht für:

current working directory

also:

aktueller Arbeitsordner

Wichtig:

Path.cwd()
= aktueller Arbeitsordner des laufenden Python-Prozesses

Path(**file**).parent
= Ordner, in dem die Python-Datei liegt

In diesem Script passt Path.cwd(), weil die Starter-Batchdatei vorher mit

cd /d "%~dp0"

in den Ordner der Batchdatei wechselt. Python übernimmt diesen Ordner
beim Start als aktuellen Arbeitsordner.

## dateien = []

Hier wird eine leere Liste erstellt.

In diese Liste werden später die gefundenen Dateien eingefügt.

## for pfad in basis_ordner.iterdir():

Diese Schleife geht die direkten Inhalte des Basisordners durch.

basis_ordner.iterdir() liefert die Elemente des Ordners nacheinander als
Path-Objekte.

Beispiele:

Path-Objekt zu bild_start.jpg
Path-Objekt zu notiz.txt
Path-Objekt zu Bilder
Path-Objekt zu protokoll.log

Wichtig:

iterdir()
= direkte Inhalte des Ordners durchgehen
= nicht rekursiv
= Unterordner werden nicht automatisch durchsucht

## pfad

pfad ist die Variable für das aktuelle Path-Objekt in der Schleife.

Bei jedem Durchlauf steht ein anderes Element aus dem Ordner in pfad.

## if pfad.is_file():

Diese Zeile prüft, ob das aktuelle Path-Objekt eine Datei ist.

is_file() gibt True oder False zurück.

Beispiel:

bild_start.jpg  = True
notiz.txt       = True
Bilder          = False

Dadurch werden Ordner übersprungen.

## dateien.append(pfad)

append() hängt einen Eintrag an eine Liste an.

dateien.append(pfad) bedeutet:

Füge das aktuelle Path-Objekt an die Liste dateien an.

Nach der Schleife enthält dateien die gefundenen Dateien als
Path-Objekte.

## rglob("*")

rglob steht sinngemäß für:

recursive glob

also:

rekursive Mustersuche

basis_ordner.rglob("*") bedeutet:

Suche alles im Basisordner und in allen Unterordnern.

Der Stern * bedeutet:

alles

Da rglob("*") Dateien und Ordner liefern kann, wird danach wieder mit
is_file() geprüft, ob das aktuelle Element eine Datei ist.

## glob("*")

glob("*") könnte ebenfalls verwendet werden, wenn man nach einem Muster
im aktuellen Ordner suchen möchte.

Der Unterschied:

iterdir()
= direkte Inhalte des Ordners durchgehen

glob("*")
= alles nach Muster * im aktuellen Ordner suchen

rglob("*")
= alles nach Muster * rekursiv inklusive Unterordner suchen

Für den Grundkurs ist iterdir() bei der einfachen Variante besonders
gut lesbar.

============================================================
8. List Comprehension
=====================

Im Script gibt es zusätzlich kompakte Python-Schreibweisen als
Kommentar.

Beispiel:

dateien = [pfad for pfad in basis_ordner.iterdir() if pfad.is_file()]

Diese Schreibweise nennt man List Comprehension.

Sie ist kürzer, aber für Einsteiger oft schwerer zu lesen.

Sie entspricht dieser ausführlichen Variante:

dateien = []

for pfad in basis_ordner.iterdir():
if pfad.is_file():
dateien.append(pfad)

Die Struktur ist:

[WAS soll in die Liste  for aktuelles_element in datenquelle  if Bedingung]

Bei diesem Beispiel:

[pfad for pfad in basis_ordner.iterdir() if pfad.is_file()]

bedeutet das:

Füge pfad in die neue Liste ein,
für jedes pfad aus basis_ordner.iterdir(),
wenn pfad.is_file() wahr ist.

Wichtig:

Das erste pfad steht für den Wert, der in die neue Liste kommt.
Das zweite pfad ist die Variable des aktuellen Schleifendurchlaufs.

Wenn man nur die Dateinamen speichern möchte, könnte man schreiben:

[pfad.name for pfad in basis_ordner.rglob("*") if pfad.is_file()]

Dann würden nicht die Path-Objekte selbst, sondern nur die Dateinamen in
der Liste landen.

============================================================
9. Listenvarianten in der einfachen Version
===========================================

In der einfachen Variante gibt es mehrere Möglichkeiten.

Wichtig:
Immer nur eine Listenvariante aktiv lassen.

## Variante 1: Nur Dateinamen

liste = []

for datei in dateien:
liste.append(datei.name)

Diese Variante gibt nur die Dateinamen aus.

Beispielausgabe:

archiv_test.zip
bild_start.jpg
notiz.txt
protokoll.log
rechnung_maerz.pdf

## datei.name

name ist eine Eigenschaft eines Path-Objekts.

Beispiel:

Path:
C:\Test\Bilder\bild01.png

datei.name:
bild01.png

## Variante 2: Relative Pfade

liste = []

for datei in dateien:
relativer_pfad = datei.relative_to(basis_ordner)
liste.append(str(relativer_pfad))

relative_to() berechnet den Pfad relativ zu einem angegebenen
Basisordner.

Beispiel:

Vollständiger Pfad:

C:\TOPTORIALS_CODE\020_Python_Grundkurs\003_Dateiliste_erstellen\01_Einfach\Bilder\bild01.png

Basisordner:

C:\TOPTORIALS_CODE\020_Python_Grundkurs\003_Dateiliste_erstellen\01_Einfach

Ergebnis:

Bilder\bild01.png

Da relative_to() wieder ein Path-Objekt liefert, wird es mit str(...) in
Text umgewandelt.

## Variante 3: Absolute Pfade

liste = []

for datei in dateien:
absoluter_pfad = datei.resolve()
liste.append(str(absoluter_pfad))

resolve() liefert den vollständigen, aufgelösten Pfad.

Beispiel:

C:\TOPTORIALS_CODE\020_Python_Grundkurs\003_Dateiliste_erstellen\01_Einfach\bild_start.jpg

Auch hier wird das Path-Objekt mit str(...) in Text umgewandelt, damit
es in die Textliste geschrieben werden kann.

============================================================
10. Ausgabe in Datei und Zwischenablage
=======================================

## inhalt = "\n".join(liste)

liste enthält mehrere einzelne Textwerte.

Beispiel:

["bild_start.jpg", "notiz.txt", "protokoll.log"]

Für eine Textdatei oder die Zwischenablage brauchen wir daraus einen
zusammenhängenden Text.

\n bedeutet:

neue Zeile

join(liste) verbindet alle Einträge aus der Liste.

Diese Zeile bedeutet also:

Verbinde alle Listeneinträge mit einem Zeilenumbruch dazwischen.

Aus:

["bild_start.jpg", "notiz.txt", "protokoll.log"]

wird:

bild_start.jpg
notiz.txt
protokoll.log

## Path(ausgabe_datei).write_text(inhalt, encoding="utf-8")

Diese Zeile schreibt den fertigen Text in eine Datei.

Path(ausgabe_datei) macht aus dem Text dateiliste.txt ein Path-Objekt.

write_text() schreibt Text in diese Datei.

encoding="utf-8" sorgt dafür, dass die Datei als UTF-8 gespeichert wird.

Wichtig:

write_text()
= Datei erstellen oder vorhandenen Inhalt überschreiben

Wenn dateiliste.txt schon existiert, wird der Inhalt ersetzt.

## subprocess.run("clip", ...)

Mit subprocess.run() wird ein externes Programm gestartet.

In diesem Script wird das Windows-Programm clip gestartet.

clip übernimmt Text und kopiert ihn in die Zwischenablage.

Der verwendete Block:

subprocess.run(
"clip",
input=inhalt,
text=True,
encoding="utf-8",
check=True
)

Bedeutung:

subprocess.run()
= externes Programm starten

"clip"
= Windows-Programm für die Zwischenablage

input=inhalt
= dieser Text wird an clip übergeben

text=True
= input wird als Text behandelt

encoding="utf-8"
= Text wird als UTF-8 übergeben

check=True
= bei Fehler wird ein Python-Fehler ausgelöst

Das ist vergleichbar mit Set-Clipboard in PowerShell.

============================================================
11. Wichtige Begriffe der SendTo-Variante
=========================================

## import sys

In der SendTo-Variante brauchen wir zusätzlich das Modul sys.

Damit können wir auf Startparameter zugreifen.

Diese Startparameter stehen in:

sys.argv

## sys.argv

sys.argv ist eine Liste mit den Startargumenten.

Dabei gilt:

sys.argv[0]  = Name oder Pfad des Python-Skripts
sys.argv[1]  = erster übergebener Parameter
sys.argv[2]  = zweiter übergebener Parameter
sys.argv[3]  = dritter übergebener Parameter

## sys.argv[1:]

Mit sys.argv[1:] nehmen wir alles ab Position 1.

Also alle übergebenen Dateien oder Ordner, aber nicht den Skriptnamen.

Beispiel:

sys.argv[0] = 003_sendto_dateiliste_erstellen.py
sys.argv[1] = C:\Test\bild01.png
sys.argv[2] = C:\Test\notiz.txt
sys.argv[3] = C:\Test\Bilder

Dann enthält elemente:

elemente[0] = C:\Test\bild01.png
elemente[1] = C:\Test\notiz.txt
elemente[2] = C:\Test\Bilder

Am Anfang sind das noch Textwerte.

## if not elemente:

Diese Zeile prüft, ob die Liste elemente leer ist.

Wenn die SendTo-Datei direkt per Doppelklick gestartet wird, wurden
keine Dateien oder Ordner übergeben.

Dann ist elemente leer.

not elemente bedeutet hier:

Wenn keine Elemente vorhanden sind.

## sys.exit()

sys.exit() beendet das Script.

In dieser SendTo-Variante wird es verwendet, wenn keine Dateien oder
Ordner übergeben wurden.

## uebergebene_elemente = []

Diese Liste nimmt später nur die übergebenen Dateien und Ordner auf, die
wirklich existieren.

## for element in elemente:

Diese Schleife geht alle übergebenen Werte aus elemente durch.

Bei jedem Durchlauf steht ein einzelner Textpfad in der Variable
element.

## pfad = Path(element)

Diese Zeile macht aus dem Textpfad ein Path-Objekt.

Vorher:

element = Textpfad

Nachher:

pfad = Path-Objekt

Dadurch können Methoden verwendet werden wie:

exists()
is_dir()
is_file()
name
resolve()
rglob()

## if pfad.exists():

Diese Zeile prüft, ob der übergebene Pfad wirklich existiert.

Nur wenn das der Fall ist, wird der Pfad weiterverarbeitet.

## uebergebene_elemente.append(pfad)

Wenn der Pfad existiert, wird das Path-Objekt an die Liste
uebergebene_elemente angehängt.

Nach der Schleife enthält uebergebene_elemente gültige Dateien und
Ordner als Path-Objekte.

============================================================
12. Listenvarianten in der SendTo-Version
=========================================

Auch in der SendTo-Version gibt es mehrere Möglichkeiten.

Wichtig:
Immer nur eine Listenvariante aktiv lassen.

## Variante 1: Nur Namen der markierten Dateien und Ordner

liste = []

for element in uebergebene_elemente:
liste.append(element.name)

Diese Variante gibt nur die Namen der markierten Dateien und Ordner aus.

Beispiel Datei:

C:\Test\bild01.png
→ bild01.png

Beispiel Ordner:

C:\Test\Bilder
→ Bilder

Wenn ein Ordner markiert wurde, wird in dieser Variante nur der
Ordnername ausgegeben. Es wird nicht automatisch in den Ordner
hineingeschaut.

## Variante 2: Vollständige Pfade der markierten Dateien und Ordner

liste = []

for element in uebergebene_elemente:
liste.append(str(element.resolve()))

Diese Variante gibt die vollständigen Pfade der markierten Dateien oder
Ordner aus.

## Variante 3: Rekursiv - absolute Pfade aller Dateien

liste = []

for element in uebergebene_elemente:
if element.is_dir():
for datei in element.rglob("*"):
if datei.is_file():
liste.append(str(datei.resolve()))
else:
liste.append(str(element.resolve()))

Diese Variante prüft jedes übergebene Element.

Wenn es ein Ordner ist, wird dieser Ordner rekursiv durchsucht.
Alle gefundenen Dateien werden mit vollständigem Pfad ausgegeben.

Wenn es eine einzelne Datei ist, wird ihr vollständiger Pfad direkt
übernommen.

## element.is_dir()

is_dir() prüft, ob das Path-Objekt ein Ordner ist.

Das ist vergleichbar mit PSIsContainer in PowerShell.

PowerShell:

$element.PSIsContainer

Python:

element.is_dir()

## Variante 4: Rekursiv - relative Pfade aller Dateien

liste = []

for element in uebergebene_elemente:
if element.is_dir():
for datei in element.rglob("*"):
if datei.is_file():
relativer_pfad = datei.relative_to(element)
liste.append(str(relativer_pfad))
else:
try:
relativer_pfad = element.relative_to(basis_ordner)
liste.append(str(relativer_pfad))
except ValueError:
liste.append(element.name)

Diese Variante funktioniert ähnlich wie Variante 3, gibt aber relative
Pfade aus.

Wenn ein Ordner übergeben wurde, wird der Pfad relativ zum übergebenen
Ordner berechnet.

Beispiel:

Übergebener Ordner:

C:\Test\Projekt

Gefundene Datei:

C:\Test\Projekt\Bilder\bild01.png

Ergebnis:

Bilder\bild01.png

Wenn eine einzelne Datei übergeben wurde, versucht das Script, den Pfad
relativ zum aktuellen Basisordner zu berechnen.

Das funktioniert nur, wenn die Datei wirklich innerhalb dieses
Basisordners liegt.

Falls das nicht möglich ist, würde Python einen ValueError auslösen.

Damit das Script nicht abbricht, wird dieser Fehler mit except ValueError
abgefangen.

Dann wird als sichere Ersatzlösung nur der Dateiname übernommen.

## try / except

try bedeutet:

Versuche den folgenden Code auszuführen.

except fängt einen bestimmten Fehler ab.

In diesem Script:

try:
relativer_pfad = element.relative_to(basis_ordner)
liste.append(str(relativer_pfad))
except ValueError:
liste.append(element.name)

Bedeutung:

Versuche, den relativen Pfad zu berechnen.
Wenn das nicht möglich ist, nimm stattdessen nur den Dateinamen.

## append und extend

append()
= einen einzelnen Eintrag anhängen

extend()
= mehrere Einträge aus einer Sammlung anhängen

Für diesen Grundkurs verwenden wir hauptsächlich append(), weil es
leichter zu verstehen ist.

============================================================
13. Wichtige Batch-Begriffe der Starter-Dateien
===============================================

## chcp 65001 >nul

Diese Zeile setzt die Codepage der Eingabeaufforderung auf UTF-8.

65001 steht für UTF-8.

> nul sorgt dafür, dass die Rückmeldung von chcp nicht angezeigt wird.

## cd /d "%~dp0"

Diese Zeile wechselt in den Ordner der Starter-Batchdatei.

%~dp0 steht in einer Batchdatei für den Ordner, in dem die Batchdatei
selbst liegt.

Wichtig:
%~dp0 enthält bereits den abschließenden Backslash.

Deshalb wird zuerst mit

cd /d "%~dp0"

in den Ordner gewechselt. Danach wird die Python-Datei nur noch über
ihren Dateinamen gestartet.

Python übernimmt diesen Ordner beim Start als aktuellen Arbeitsordner.

Das ist wichtig für:

Path.cwd()

/d sorgt dafür, dass der Ordnerwechsel auch funktioniert, wenn dabei
das Laufwerk gewechselt werden muss.

## py

py startet den Python Launcher.

Beispiel:

py "003_dateiliste_erstellen.py"

Falls py nicht funktioniert, kann als Alternative python getestet werden.

## python

python kann verwendet werden, wenn Python direkt über diesen Befehl im
System gefunden wird.

Beispiel:

python "003_dateiliste_erstellen.py"

## %*

%* steht in Batch für alle übergebenen Parameter.

In der SendTo-Starter-Batchdatei wird damit die komplette Übergabe an
Python weitergereicht.

Beispiel:

py "003_sendto_dateiliste_erstellen.py" %*

Wichtig:

%*
= alle Parameter weitergeben

"%*"
= alles zu einem einzigen Parameter zusammenfassen

Deshalb wird %* hier nicht zusätzlich komplett in Anführungszeichen
gesetzt.

## "%~1"

"%~1" wäre für einen einzelnen Parameter sinnvoll.

%1 steht für den ersten übergebenen Parameter.
%~1 entfernt äußere Anführungszeichen.
"%~1" setzt selbst wieder saubere Anführungszeichen darum.

Für mehrere übergebene Dateien oder Ordner ist hier aber %* richtig.

============================================================
14. UTF-8 und Umlaute
=====================

Für diese Kursreihe sollten die Scriptdateien als UTF-8 gespeichert
werden.

Die Starter-Batchdateien setzen zusätzlich die Codepage auf UTF-8:

chcp 65001 >nul

Die Python-Dateien schreiben Textdateien mit:

encoding="utf-8"

Das hilft bei Umlauten und Sonderzeichen.

In Visual Studio Code sieht man die Kodierung normalerweise unten rechts
in der Statusleiste. Dort sollte UTF-8 stehen.

============================================================
15. Testmodus und Sicherheit
============================

Dieses Script liest Dateien und Ordner aus.

Es löscht keine Dateien.
Es verschiebt keine Dateien.
Es benennt keine Dateien um.
Es verändert keine vorhandenen Dateien.

Es erstellt aber eine neue Textdatei:

dateiliste.txt

oder bei der SendTo-Variante:

dateiliste_sendto.txt

Wenn diese Datei bereits existiert, wird der Inhalt durch write_text()
ersetzt.

Außerdem wird der Inhalt der Liste in die Zwischenablage kopiert.

Empfehlung:

Nicht direkt mit wichtigen Originaldateien testen.
Zuerst in einem separaten Testordner ausprobieren.
Danach kontrollieren, ob die erzeugte Dateiliste wie erwartet aussieht.

Die Nutzung erfolgt auf eigene Verantwortung.

============================================================
16. Typische Fehler
===================

## Python wurde nicht gefunden

Wenn py nicht funktioniert, ist der Python Launcher eventuell nicht
installiert oder nicht verfügbar.

In der Starter-Batchdatei ist eine Alternative vorbereitet:

python "003_dateiliste_erstellen.py"

Falls python ebenfalls nicht gefunden wird, muss Python installiert oder
der Systempfad geprüft werden.

## SendTo-Datei direkt gestartet

Wenn die SendTo-Starter-Batchdatei direkt per Doppelklick gestartet
wird, wurden keine Dateien oder Ordner übergeben.

Dann erscheint eine Meldung wie:

Bitte markiere Dateien oder Ordner und sende sie an dieses Skript.

Die SendTo-Variante ist dafür gedacht, dass Dateien oder Ordner über
"Senden an" übergeben werden.

## Nur ein Ordnername in der SendTo-Liste

Wenn nur ein Ordner markiert wurde und Variante 1 aktiv ist, ist das
korrekt. Variante 1 gibt nur den Namen des markierten Elements aus.

Wenn der Inhalt eines Ordners ausgegeben werden soll, muss Variante 3
oder Variante 4 aktiviert werden.

## Mehrere Listenvarianten gleichzeitig aktiv

Wenn mehrere Listenvarianten gleichzeitig aktiv sind, wird liste
mehrfach gesetzt.

Dann gilt am Ende die letzte aktive Variante.

Deshalb:

Immer nur eine Listenvariante aktiv lassen.

## Relative Pfade funktionieren nicht bei jeder Datei

relative_to() funktioniert nur dann, wenn der Pfad wirklich innerhalb
des angegebenen Basisordners liegt.

Deshalb wird in der SendTo-Variante bei einzeln übergebenen Dateien mit
try und except ValueError gearbeitet.

Wenn kein relativer Pfad berechnet werden kann, wird als sichere
Ersatzlösung nur der Dateiname verwendet.

## Umlaute werden falsch angezeigt

Wenn Umlaute falsch angezeigt werden, prüfen:

* Datei als UTF-8 gespeichert?
* VS Code unten rechts auf UTF-8?
* Starter-Batchdatei nutzt chcp 65001?
* Python-Datei nutzt encoding="utf-8"?

============================================================
17. Wichtige Lernpunkte
=======================

In diesem Teil sieht man unter anderem:

* wie Path aus pathlib importiert wird
* wie Python mit Path-Objekten arbeitet
* wie der aktuelle Arbeitsordner mit Path.cwd() gelesen wird
* warum Path.cwd() vom aktuellen Prozessordner abhängig ist
* wie die Starter-Batchdatei mit cd /d "%~dp0" den Arbeitsordner setzt
* wie iterdir() die direkten Inhalte eines Ordners liefert
* wie rglob("*") rekursiv inklusive Unterordner sucht
* wie is_file() Dateien erkennt
* wie is_dir() Ordner erkennt
* wie exists() prüft, ob ein Pfad existiert
* wie append() Einträge an eine Liste anhängt
* wie name den Namen eines Path-Objekts liefert
* wie resolve() den vollständigen Pfad liefert
* wie relative_to() einen relativen Pfad berechnet
* wie List Comprehensions als kompaktere Schreibweise funktionieren
* wie sys.argv Startargumente enthält
* warum sys.argv[1:] alle Parameter ohne Skriptnamen enthält
* wie "\n".join(liste) Listeneinträge mit Zeilenumbrüchen verbindet
* wie write_text() eine Textdatei schreibt
* wie subprocess.run() ein externes Programm startet
* wie clip Text in die Windows-Zwischenablage kopiert
* warum %* in Batch alle Parameter weitergibt
* warum "%*" mehrere Parameter zu einem einzigen Parameter machen würde
* warum immer nur eine Listenvariante aktiv sein sollte

============================================================
18. Kurz zusammengefasst
========================

## 01_Einfach

Diese Variante erstellt eine Dateiliste aus dem aktuellen Ordner.

Gut zum Verstehen der Grundlogik.

## 02_SendTo_Dateiliste_erstellen

Diese Variante erstellt eine Dateiliste aus übergebenen Dateien oder
Ordnern.

Gut für den praktischen Workflow im Windows-Explorer.

Die einfache Variante ist gut zum Lernen.
Die SendTo-Variante ist besser für den Alltag.

Die Nutzung erfolgt auf eigene Verantwortung.
