﻿============================================================
TOPTORIALS OFFICE - PowerShell 7 Grundkurs
Teil 010: Zwei Ordner vergleichen und fehlende Dateien finden
============================================================

Autor: Chris
Webseite: https://www.toptorials.com
YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
Skriptversionen: Feste Ordner 1.0 / SendTo 1.1
Stand dieser Anleitung: 15.09.2026


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

Beginnt mit Kopien unwichtiger Dateien und prüft die angezeigten
Vergleichsordner.

Für den Testmodus muss _test im tatsächlichen Dateinamen der
Starter-Batchdatei stehen. Der Name einer Verknüpfung allein
aktiviert den Testmodus nicht.

Im Fenster muss stehen:

Testmodus: JA

Der Vergleich wird vollständig durchgeführt und angezeigt.
Es entstehen aber keine Ergebnisdateien. Die SendTo-Version
kopiert die Berichte auch im Testmodus in die Zwischenablage
und ersetzt damit deren bisherigen Inhalt.

Im Echtmodus werden zusätzlich Ergebnisdateien gespeichert.
Die Frage JA/NEIN betrifft ausschließlich die Dateiendung.
Es gibt keine weitere Sicherheitsbestätigung zum Speichern.

Verglichen werden ausschließlich Dateinamen. Dateiinhalte,
Dateigrößen und Änderungszeiten werden nicht geprüft.
Die untersuchten Projektdateien werden weder umbenannt noch
kopiert, verschoben oder gelöscht.


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

01. Worum geht es?
02. Voraussetzungen
03. Ordner und Dateien
04. Schnellstart: feste Ordner
05. SendTo einrichten und verwenden
06. Testmodus und Echtmodus
07. Vergleich mit oder ohne Dateiendung
08. Dateianzahl und fehlende Namen
09. Ergebnisdateien und Zwischenablage
10. Berücksichtigte Dateien und Ausschlüsse
11. Aufgaben der Starter-Batchdateien
12. Direkter Aufruf mit PowerShell 7
13. Häufige Fragen und Fehler
14. Grenzen und Sicherheit
15. Kurze Zusammenfassung


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

Diese Skripte vergleichen die direkt enthaltenen Dateien aus
zwei Ordnern anhand ihrer Namen. Geprüft wird in beide Richtungen:

- Welche Namen aus Ordner 2 fehlen in Ordner 1?
- Welche Namen aus Ordner 1 fehlen in Ordner 2?

Zur Auswahl stehen zwei Varianten:

Feste Ordner:
Die beiden Vergleichspfade stehen direkt im PowerShell-Skript.
Ein gemeinsamer Ergebnisbericht enthält beide Richtungen.

SendTo:
Genau zwei Ordner werden aus dem Windows-Explorer übergeben.
Jeder Ordner erhält im Echtmodus einen Bericht mit den Namen,
die dort fehlen. Beide Berichte gelangen außerdem in die
Zwischenablage.


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

- Windows mit installiertem PowerShell 7.
- pwsh.exe muss über den Suchpfad erreichbar sein.
- Leserechte in beiden Vergleichsordnern.
- Schreibrechte am Ablageort der Berichte für den Echtmodus.
- PowerShell-Skript und passender Starter liegen nebeneinander.

PowerShell 7 lässt sich in einer Konsole prüfen mit:

pwsh --version

Die Skripte sind für PowerShell 7 vorgesehen. Windows
PowerShell 5.1 mit powershell.exe ist nicht die Kursumgebung.
Zusätzliche PowerShell-Module sind nicht erforderlich.


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

Vorgesehener Hauptordner:

C:\TOPTORIALS_CODE\010_PowerShell_7_Grundkurs\010_Fehlende_Dateien_vergleichen

Diese README.txt gehört direkt in den Hauptordner.
Alle folgenden Skriptdateinamen sind kleingeschrieben.

Unterordner 1:

01_Feste_Ordner_vergleichen

Dateien:

010_fehlende_dateien_vergleichen.ps1
010_fehlende_dateien_vergleichen_starter_batch_test.bat
010_fehlende_dateien_vergleichen_starter_batch.bat

Unterordner 2:

02_SendTo_Zwei_Ordner_vergleichen

Dateien:

010_sendto_zwei_ordner_vergleichen.ps1
010_sendto_zwei_ordner_vergleichen_starter_batch_test.bat
010_sendto_zwei_ordner_vergleichen_starter_batch.bat

Die Starter mit und ohne _test besitzen jeweils denselben Code.
Falls nur der Teststarter vorhanden ist, könnt ihr ihn kopieren
und bei der Kopie _test aus dem Dateinamen entfernen.


04. SCHNELLSTART: FESTE ORDNER
============================================================

1. Öffnet 010_fehlende_dateien_vergleichen.ps1 im Texteditor.

2. Prüft die Variablen $testbereich, $ordner1 und $ordner2.
   Die voreingestellten vollständigen Vergleichspfade lauten:

C:\TOPTORIALS_CODE\1000_TESTBEREICH\TOPTORIALS_Testdaten_Windows_Automatisierung_PowerShell_7_V001\010_Fehlende_Dateien_vergleichen\01_Feste_Ordner_vergleichen\01_Ordner_1

C:\TOPTORIALS_CODE\1000_TESTBEREICH\TOPTORIALS_Testdaten_Windows_Automatisierung_PowerShell_7_V001\010_Fehlende_Dateien_vergleichen\01_Feste_Ordner_vergleichen\02_Ordner_2

   Die Ordner müssen bereits existieren. Bei anderen Pfaden
   passt ihr die Variablen an. Das Skript legt sie nicht an.

3. Startet per Doppelklick:

010_fehlende_dateien_vergleichen_starter_batch_test.bat

4. Prüft die Anzeige Testmodus: JA und beide Ordnerpfade.

5. Beantwortet die Frage zur Dateiendung mit JA oder NEIN.

6. Kontrolliert beide Fehlstellenlisten und die Zusammenfassung.

7. Wenn ihr einen Bericht speichern möchtet, startet:

010_fehlende_dateien_vergleichen_starter_batch.bat

Der Bericht entsteht im Ordner der PowerShell-Datei.


05. SENDTO EINRICHTEN UND VERWENDEN
============================================================

Einrichtung:

1. Lasst die SendTo-PS1-Datei und beide Starter gemeinsam in:

C:\TOPTORIALS_CODE\010_PowerShell_7_Grundkurs\010_Fehlende_Dateien_vergleichen\02_SendTo_Zwei_Ordner_vergleichen

2. Drückt Windows + R und gebt ein:

shell:sendto

3. Legt im geöffneten Ordner Verknüpfungen zu den beiden
   Starter-Batchdateien an. Kopiert nicht nur die Batchdateien
   dorthin, da diese die PS1-Datei neben sich erwarten.

4. Vergebt aussagekräftige Verknüpfungsnamen, beispielsweise:

PowerShell 10 - Ordnervergleich Test
PowerShell 10 - Ordnervergleich

Anwendung:

1. Markiert im Explorer genau zwei Ordner.
2. Öffnet das Kontextmenü und wählt Senden an.
   Gegebenenfalls zunächst Weitere Optionen anzeigen wählen.
3. Wählt den gewünschten Vergleichsstarter.
4. Prüft die angezeigten Pfade und den Modus.
5. Beantwortet die Frage zur Dateiendung.
6. Kontrolliert die Ergebnisse.
7. Mit Strg + V könnt ihr beide Berichte in einen Editor einfügen.

Welche Auswahl als Ordner 1 oder Ordner 2 ankommt, ist für den
beidseitigen Vergleich unerheblich. Jeder Bericht nennt seine
beiden zugehörigen Pfade.

Dateien, mehr oder weniger als zwei Argumente sowie zweimal
dieselben normalisierten Ordnerpfade werden zurückgewiesen.


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

Mit _test im tatsächlichen Namen des Starters:

- Die Batchdatei übergibt -Test an PowerShell.
- Das Skript zeigt Testmodus: JA.
- Der Vergleich wird durchgeführt und angezeigt.
- Es werden keine Ergebnisdateien erstellt.
- Bei SendTo wird die Zwischenablage trotzdem aktualisiert.

Ohne _test im Namen des Starters:

- Das Skript zeigt Testmodus: NEIN.
- Der Vergleich wird durchgeführt und angezeigt.
- Die Berichte werden zusätzlich gespeichert.
- Bei SendTo wird die Zwischenablage ebenfalls aktualisiert.

Wichtig:
Das Umbenennen einer SendTo-Verknüpfung verändert den Modus
nicht. Entscheidend ist die tatsächlich aufgerufene Batchdatei.


07. VERGLEICH MIT ODER OHNE DATEIENDUNG
============================================================

Die Frage lautet:

Dateiendung berücksichtigen? JA/NEIN

JA:
Verglichen wird Name, also der vollständige Dateiname.
Bericht.docx und Bericht.pdf gelten als unterschiedliche Namen.

NEIN:
Verglichen wird BaseName, also der Name ohne letzte Endung.
Bericht.docx und Bericht.pdf ergeben beide den Namen Bericht.

Weitere Beispiele:

Dateiname                  Basisname
Bericht.final.pdf          Bericht.final
Foto.jpg                   Foto
Notiz                      Notiz

Groß- und Kleinschreibung werden beim Vergleich ignoriert.
Foto.jpg und FOTO.JPG gelten als gleicher Vergleichsname.

Auch ja, nein oder gemischte Schreibweisen werden als Eingabe
akzeptiert. Leerraum am Anfang und Ende wird entfernt.
Andere Eingaben führen zu einer Fehlermeldung.


08. DATEIANZAHL UND FEHLENDE NAMEN
============================================================

Dateizähler und Namenszähler haben unterschiedliche Aufgaben.

Beispiel:

Ordner 1 enthält Bild.jpg und Bild.png.
Ordner 2 enthält keinen entsprechenden Namen.

Beim Vergleich ohne Endung:

Dateien in Ordner 1: 2
Fehlende Namen in Ordner 2: 1

Der Grund: Sort-Object -Unique fasst die beiden Basisnamen Bild
zu einem einzigen Vergleichsnamen zusammen.

Wenn Ordner 2 beispielsweise Bild.pdf enthält, fehlt dort beim
Vergleich ohne Endung kein Name.

Eine leere Fehlstellenliste bedeutet, dass für diese Richtung
keine fehlenden Vergleichsnamen gefunden wurden. Auch zwei
leere Ordner können miteinander verglichen werden.


09. ERGEBNISDATEIEN UND ZWISCHENABLAGE
============================================================

Feste Ordner:

Eine gemeinsame Textdatei im Ordner des PowerShell-Skripts:

vergleich_ergebnis_2026-09-15_12-30-00.txt

SendTo:

Eine Textdatei in JEDEM übergebenen Vergleichsordner:

C:\Test\Ordner_A\vergleich_fehlt_hier_2026-09-15_12-30-00.txt
C:\Test\Ordner_B\vergleich_fehlt_hier_2026-09-15_12-30-00.txt

Der Bericht in Ordner A listet die Namen auf, die in A fehlen.
Der Bericht in Ordner B listet die Namen auf, die in B fehlen.

Gespeichert wird mit UTF-8-Kodierung. Der Zeitstempel enthält
Jahr, Monat, Tag, Stunde, Minute und Sekunde.

-NoClobber verhindert das Überschreiben einer bereits
vorhandenen gleichnamigen Ergebnisdatei. Es gibt keine
automatische Zusatznummerierung bei Namenskonflikten.

Die SendTo-Berichte werden nacheinander gespeichert. Falls der
zweite Schreibvorgang fehlschlägt, kann der erste Bericht bereits
vorhanden sein. Jede erfolgreiche Speicherung wird angezeigt.

Zwischenablage:

Die SendTo-Version verbindet beide Berichte zu einem Text und
kopiert ihn mit Set-Clipboard in die Zwischenablage. Der bisherige
Zwischenablageinhalt wird ersetzt, auch im Testmodus.

Ist die Zwischenablage nicht verfügbar, erscheint eine gelbe
Fehlermeldung. Das Skript setzt den weiteren Ablauf fort.
Die normale Variante verwendet die Zwischenablage nicht.


10. BERÜCKSICHTIGTE DATEIEN UND AUSSCHLÜSSE
============================================================

Get-ChildItem -File -Force ermittelt nur direkt enthaltene Dateien,
auch versteckte Dateien. Bestehende Zugriffsrechte gelten weiter.
Unterordner werden nicht durchsucht; -Recurse wird nicht verwendet.

Es gibt keinen allgemeinen Ausschluss für Endungen wie .bat,
.ps1, .py oder .log.

Nur SendTo schließt folgendes Namensmuster aus:

vergleich_fehlt_hier_*.txt

Diese Namen sind für Ergebnisberichte reserviert. Auch eine
selbst angelegte Datei mit einem passenden Namen wird ignoriert.
Ausgeschlossene Dateien fehlen ebenfalls in den Dateizählern.

Die normale Variante besitzt diesen Filter nicht. Wenn ihr den
Skriptordner selbst als Vergleichsordner verwendet, können alte
Ergebnisdateien beim nächsten Durchlauf mitgezählt werden.
Verwendet für diese Variante die separaten Vergleichsordner.


11. AUFGABEN DER STARTER-BATCHDATEIEN
============================================================

Die Starter:

- Erkennen _test im eigenen Dateinamen.
- Starten PowerShell 7 über pwsh.exe.
- Finden die PS1-Datei neben sich mithilfe von %~dp0.
- Übergeben bei Bedarf -Test.
- Reichen bei SendTo mit %* die Ordnerpfade weiter.
- Übernehmen den Rückgabecode in EXITCODE.
- Halten das Fenster mit pause offen.

DisableDelayedExpansion deaktiviert die verzögerte
Variablenersetzung und bewahrt Ausrufezeichen in den Pfaden.

-NoProfile verhindert das Laden persönlicher PowerShell-Profile.
-ExecutionPolicy Bypass gilt für den gestarteten Prozess und
ändert die systemweite Ausführungsrichtlinie nicht dauerhaft.


12. DIREKTER AUFRUF MIT POWERSHELL 7
============================================================

Wechselt zuerst in den jeweiligen Skriptordner.

Feste Ordner, Testmodus:

pwsh.exe -NoProfile -File ".\010_fehlende_dateien_vergleichen.ps1" -Test

Feste Ordner, Echtmodus:

pwsh.exe -NoProfile -File ".\010_fehlende_dateien_vergleichen.ps1"

SendTo, Testmodus:

pwsh.exe -NoProfile -File ".\010_sendto_zwei_ordner_vergleichen.ps1" -Test "C:\Test\Ordner_A" "C:\Test\Ordner_B"

SendTo, Echtmodus:

pwsh.exe -NoProfile -File ".\010_sendto_zwei_ordner_vergleichen.ps1" "C:\Test\Ordner_A" "C:\Test\Ordner_B"

Bei einem direkten Aufruf entscheidet -Test über den Modus.
Die PS1-Datei prüft ihren eigenen Dateinamen nicht auf _test.


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

SendTo schreibt im Skriptordner:

Prüft den Inhalt von 010_sendto_zwei_ordner_vergleichen.ps1.
Die richtige Version enthält den Parameter $Elemente und zwei
Ausgabepfade aus den übergebenen Ordnern. Feste Testpfade und
$PSScriptRoot als Berichtsziel gehören zur normalen Variante.
Möglicherweise wurde deren Inhalt versehentlich hineinkopiert.

Die PS1-Datei wird nicht gefunden:

Prüft den Namen im Starter und den tatsächlichen Dateinamen.
Die Original-Batchdatei und die PS1-Datei müssen nebeneinander
liegen. Verwendet in Senden an eine Verknüpfung zum Starter.

Ordner nicht gefunden:

Prüft die festen Pfade beziehungsweise die ausgewählten Ordner.
Die Vergleichsordner müssen bereits vorhanden und lesbar sein.

Keine Ergebnisdatei vorhanden:

Im Testmodus ist das beabsichtigt. Im Echtmodus kontrolliert die
Fehlermeldung auf fehlende Schreibrechte oder Namenskonflikte.

Der Bericht enthält keine fehlenden Namen:

Alle Vergleichsnamen sind in beiden Ordnern vorhanden. Das sagt
nichts darüber aus, ob die Dateiinhalte gleich sind.

Die Dateizähler unterscheiden sich, aber es fehlt kein Name:

Beim Vergleich ohne Endung können mehrere Dateien denselben
Basisnamen besitzen. Dieser Name wird nur einmal verglichen.

Die Zwischenablage enthält noch einen alten Inhalt:

Prüft, ob die SendTo-Version eine gelbe Fehlermeldung ausgegeben
hat. Die normale Variante kopiert nichts in die Zwischenablage.

Ein Bericht mit diesem Namen existiert bereits:

Wartet bis zur nächsten Sekunde und startet erneut. Alte Berichte
werden durch -NoClobber nicht überschrieben.


14. GRENZEN UND SICHERHEIT
============================================================

Der Vergleich ist ein Namensvergleich zum Zeitpunkt des Einlesens.
Ändert ihr die Dateien während des Durchlaufs, kann der Bericht
daher vom späteren Ordnerinhalt abweichen.

Verschiedene Pfadverweise auf denselben physischen Ordner, etwa
über Laufwerkszuordnungen oder Verknüpfungen, werden nicht in
allen Fällen als identisch erkannt.

Es handelt sich nicht um eine Synchronisierung oder eine Prüfung
von Backups auf vollständige inhaltliche Übereinstimmung.

Die Nutzung dieses Codes erfolgt 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.


15. KURZE ZUSAMMENFASSUNG
============================================================

- Dateinamen aus zwei Ordnern in beide Richtungen vergleichen.
- Mit Dateiendung oder nur anhand des Basisnamens vergleichen.
- Groß- und Kleinschreibung beim Vergleich ignorieren.
- Nur direkt enthaltene Dateien berücksichtigen.
- Gleiche Vergleichsnamen zusammenfassen.
- Im Testmodus keine Ergebnisdateien erstellen.
- Im Echtmodus Textberichte speichern.
- Bei SendTo beide Berichte in die Zwischenablage kopieren.

Viel Spaß beim Ausprobieren.

Chris / TOPTORIALS OFFICE
