TOPTORIALS OFFICE - PowerShell 7 Grundkurs
Script: 004_Dateien_nach_Typ_sortieren
Autor: Chris
YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
Webseite: https://www.toptorials.com
Version: 1.0
Stand: 2026-08-03

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

1. Was machen diese Skripte?
============================

Diese Skripte sortieren Dateien automatisch nach ihrer
Dateiendung in passende Unterordner.

Es gibt zwei Varianten:

01_Einfach
02_SendTo_Dateien_nach_Typ_sortieren

Die einfache Variante sortiert die Dateien aus dem aktuellen
Arbeitsordner.

Dazu werden das PowerShell-Skript und die Starter-Batchdatei in
den gewünschten Ordner kopiert. Anschließend wird die
Starter-Batchdatei per Doppelklick gestartet.

Die SendTo-Variante verarbeitet einen oder mehrere Ordner, die im
Windows-Explorer markiert und über "Senden an" an das Skript
übergeben werden.

Die Dateien werden in folgende Kategorien einsortiert:

01_Bilder
02_Videos
03_Dokumente
04_Tabellen
05_Archive

Im Testmodus wird nur angezeigt, was bei der echten Ausführung
passieren würde.

Dabei werden:

* keine Dateien verschoben
* keine Zielordner erstellt
* keine vorhandenen Dateien verändert

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

2. Hinweis zur verwendeten Version
==================================

Diese README beschreibt die im Tutorial verwendete Version:

Version: 1.0
Stand: 2026-08-03

Die Skripte enthalten in dieser Fassung noch keine strukturierte
Fehlerbehandlung mit:

try
catch
-ErrorAction Stop

Sie verwenden außerdem keinen eigenen Fehlerzähler.

Die SendTo-Variante speichert die übergebenen Ordner in:

$Ordner

Sie verwendet dafür einen benannten Array-Parameter und nicht die
automatische Variable $args.

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

3. Enthaltene Ordner und Dateien
================================

01_Einfach

004_dateien_nach_typ_sortieren.ps1
004_dateien_nach_typ_sortieren_starter_batch_test.bat


02_SendTo_Dateien_nach_Typ_sortieren

004_sendto_dateien_nach_typ_sortieren.ps1
004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat

Die PowerShell-Dateien enthalten die eigentliche Programmlogik.

Die Starter-Batchdateien starten PowerShell 7 und übergeben bei
Bedarf den Schalter für den Testmodus sowie die ausgewählten
Ordnerpfade.

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

4. Sicherheitshinweis
=====================

Die Skripte verschieben im Echtmodus Dateien.

Teste sie deshalb zuerst mit Kopien unwichtiger Dateien in einer
separaten Testumgebung.

Solange _test im Namen der Starter-Batchdatei steht, wird das
PowerShell-Skript mit dem Parameter -Test gestartet.

Im Testmodus werden keine Dateien verschoben und keine Ordner
erstellt.

Für die echte Ausführung wird ausschließlich _test aus dem Namen
der Starter-Batchdatei entfernt.

Beispiel:

Testmodus:

004_dateien_nach_typ_sortieren_starter_batch_test.bat

Echtmodus:

004_dateien_nach_typ_sortieren_starter_batch.bat

Die PowerShell-Datei selbst wird nicht umbenannt.

Beim echten Start erscheint zusätzlich eine Sicherheitsabfrage.

Nur die exakte Eingabe:

JA

startet das Verschieben.

Vorhandene Zieldateien werden nicht überschrieben.

Existiert im Zielordner bereits eine Datei mit demselben Namen,
bleibt die Quelldatei im Ausgangsordner liegen.

Dateien werden nicht automatisch umbenannt.

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

5. Testumgebung
===============

Für die Tutorialreihe kann folgende Testumgebung verwendet werden:

C:\TOPTORIALS_CODE\1000_TESTBEREICH\
TOPTORIALS_Testdaten_Windows_Automatisierung_PowerShell_7_V001

Ein möglicher Pfad für Teil 004 ist:

C:\TOPTORIALS_CODE\1000_TESTBEREICH\
TOPTORIALS_Testdaten_Windows_Automatisierung_PowerShell_7_V001\
004_Dateien_nach_Typ_sortieren

Teste die Skripte zuerst ausschließlich mit Kopien der
bereitgestellten Beispieldateien.

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

6. Kategorien und unterstützte Dateiendungen
============================================

Die Kategorien sind in einer geordneten Hashtable gespeichert.

01_Bilder

.jpg
.jpeg
.png
.gif
.webp


02_Videos

.mp4
.mov
.mkv
.avi


03_Dokumente

.pdf
.docx
.txt


04_Tabellen

.xlsx
.xls
.csv


05_Archive

.zip
.rar
.7z

Weitere Dateiendungen können zu einem vorhandenen Array
hinzugefügt werden.

Beispiel:

"01_Bilder" = @(".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp")

Eine weitere Kategorie kann als zusätzlicher Eintrag ergänzt
werden.

Beispiel:

"06_Audio" = @(".mp3", ".wav", ".flac")

Beachte, dass beim echten Lauf alle in der Hashtable eingetragenen
Kategorieordner erstellt werden.

Das gilt in Version 1.0 auch dann, wenn für eine Kategorie momentan
keine passende Datei vorhanden ist.

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

7. Unbekannte Dateitypen
========================

Dateien mit einer unbekannten Dateiendung werden nicht
verschoben.

Sie bleiben unverändert im Ausgangsordner liegen.

Version 1.0 erzeugt für unbekannte Dateitypen keine eigene
Bildschirmmeldung.

Diese Dateien werden außerdem nicht vom Zähler für übersprungene
Dateien erfasst.

Der Übersprungen-Zähler bezieht sich in dieser Version auf
Namenskonflikte mit bereits vorhandenen Zieldateien.

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

8. Variante 1: 01_Einfach
=========================

Die einfache Variante befindet sich im Ordner:

01_Einfach

Darin liegen:

004_dateien_nach_typ_sortieren.ps1
004_dateien_nach_typ_sortieren_starter_batch_test.bat

Beide Dateien werden gemeinsam in den Ordner kopiert, dessen
Dateien sortiert werden sollen.

Anschließend wird diese Datei gestartet:

004_dateien_nach_typ_sortieren_starter_batch_test.bat

Solange _test im Dateinamen steht, läuft das Skript im Testmodus.

Es zeigt zum Beispiel:

WÜRDE VERSCHIEBEN: "urlaub.jpg" nach "01_Bilder"
WÜRDE VERSCHIEBEN: "intro.mp4" nach "02_Videos"

Existiert im Zielordner bereits eine gleichnamige Datei, erscheint
zum Beispiel:

WÜRDE ÜBERSPRINGEN: "urlaub.jpg" - Datei existiert bereits in
"01_Bilder"

Wenn die Vorschau korrekt aussieht, kann _test aus dem Namen der
Starter-Batchdatei entfernt werden.

Beim nächsten Start erscheint die Sicherheitsabfrage.

Erst nach der Eingabe von JA werden die Dateien wirklich
verschoben.

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

9. Variante 2: 02_SendTo_Dateien_nach_Typ_sortieren
===================================================

Die SendTo-Variante befindet sich im Ordner:

02_SendTo_Dateien_nach_Typ_sortieren

Darin liegen:

004_sendto_dateien_nach_typ_sortieren.ps1
004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat

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

Damit können ein oder mehrere Ordner markiert und über "Senden an"
an das Skript übergeben werden.

Typischer Ablauf:

1. Einen oder mehrere Ordner im Explorer markieren.
2. Mit der rechten Maustaste auf die Markierung klicken.
3. "Senden an" auswählen.
4. Die Verknüpfung zur SendTo-Starterdatei anklicken.
5. Die Ausgabe für jeden Ordner kontrollieren.
6. Im Testmodus werden keine Dateien verändert.

Jeder gültige Ordner wird einzeln verarbeitet.

Einzelne Dateien und ungültige Pfade werden übersprungen.

Im Echtmodus muss die Sicherheitsabfrage für jeden gültigen
Ordner einzeln mit JA bestätigt werden.

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

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

Den SendTo-Ordner von Windows öffnen:

Windows-Taste + R

Dann eingeben:

shell:sendto

Anschließend Enter drücken.

In diesem Ordner wird eine Verknüpfung zu folgender Datei
angelegt:

004_sendto_dateien_nach_typ_sortieren_starter_batch_test.bat

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

Rechtsklick auf einen Ordner
Senden an

Die Verknüpfung kann einen verständlicheren Namen erhalten, zum
Beispiel:

Dateien nach Typ sortieren - Test

Wird _test später für den Echtmodus aus dem Namen der
Starter-Batchdatei entfernt, muss die Verknüpfung gegebenenfalls
aktualisiert oder neu erstellt werden.

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

11. Warum gibt es Starter-Batchdateien?
=======================================

Die eigentliche Programmlogik befindet sich in den
PowerShell-Dateien.

Die Starter-Batchdateien übernehmen den kontrollierten Start.

Sie:

* stellen die Konsole auf UTF-8 um
* wechseln in den Ordner der Starterdatei
* starten PowerShell 7 über pwsh
* verwenden ExecutionPolicy Bypass für diesen Start
* erkennen _test im eigenen Dateinamen
* übergeben im Testmodus den Schalter -Test
* geben bei SendTo alle ausgewählten Pfade weiter

Der Start erfolgt über PowerShell 7:

pwsh

Nicht verwendet wird die ältere Windows PowerShell:

powershell.exe

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

12. Testmodus über den Dateinamen erkennen
=========================================

Die Starter-Batchdateien verwenden:

echo %~n0 | find /i "_test" >nul

%~n0 enthält den Namen der gestarteten Batchdatei ohne
Dateiendung.

find sucht darin nach:

_test

Der Parameter /i bedeutet, dass Groß- und Kleinschreibung
ignoriert werden.

Wurde _test gefunden, ist der Errorlevel kleiner als 1.

Dann wird das PowerShell-Skript mit folgendem Schalter gestartet:

-Test

Wurde _test nicht gefunden, wird das Skript ohne diesen Schalter
gestartet.

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

13. Der Parameter [switch]$Test
===============================

Beide PowerShell-Dateien beginnen mit einem Parameterblock.

Die einfache Variante verwendet:

param (
    [switch]$Test
)

Ein Switch-Parameter funktioniert wie ein Ein- und Ausschalter.

Start mit:

-Test

Ergebnis:

$Test ist wahr.

Start ohne:

-Test

Ergebnis:

$Test ist falsch.

Dadurch kann das Skript mit if-Abfragen zwischen Testmodus und
Echtmodus unterscheiden.

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

14. Parameter der SendTo-Variante
=================================

Die SendTo-Variante verwendet:

param (
    [switch]$Test,

    [Parameter(ValueFromRemainingArguments = $true)]
    [string[]]$Ordner
)

[string[]] bedeutet:

Ein Array aus mehreren Textwerten.

Jeder Textwert kann einen übergebenen Ordnerpfad enthalten.

ValueFromRemainingArguments = $true bedeutet:

Alle nach den bekannten Parametern verbleibenden Startargumente
werden in $Ordner gesammelt.

Beispiel:

$Ordner[0] = C:\Test\Ordner1
$Ordner[1] = C:\Test\Ordner2

Die SendTo-Version verwendet damit einen ausdrücklich benannten
Parameter.

Sie verwendet nicht:

$args

Das Array wird anschließend verarbeitet mit:

foreach ($ordnerPfad in $Ordner)

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

15. Den aktuellen Arbeitsordner bestimmen
=========================================

Die einfache Variante verwendet:

$basisOrdner = (Get-Location).Path

Get-Location liefert den aktuellen Arbeitsordner.

.Path liest daraus den vollständigen Pfad aus.

Die Starter-Batchdatei führt vorher aus:

cd /d "%~dp0"

Dadurch entspricht der aktuelle Arbeitsordner dem Ordner, in dem
die Starter-Batchdatei liegt.

Die SendTo-Variante erhält den Basisordner aus dem übergebenen
Pfad:

$basisOrdner = (Resolve-Path -LiteralPath $ordnerPfad).Path

Resolve-Path löst den übergebenen Ordnerpfad vollständig auf.

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

16. Die geordnete Hashtable $kategorien
=======================================

Die Kategorien werden so gespeichert:

$kategorien = [ordered]@{
    "01_Bilder"    = @(".jpg", ".jpeg", ".png", ".gif", ".webp")
    "02_Videos"    = @(".mp4", ".mov", ".mkv", ".avi")
    "03_Dokumente" = @(".pdf", ".docx", ".txt")
    "04_Tabellen"  = @(".xlsx", ".xls", ".csv")
    "05_Archive"   = @(".zip", ".rar", ".7z")
}

Eine Hashtable verbindet Schlüssel mit Werten.

Der Schlüssel ist hier der Name des Zielordners.

Der Wert ist ein Array mit den passenden Dateiendungen.

Beispiel:

Schlüssel:

01_Bilder

Werte:

.jpg
.jpeg
.png
.gif
.webp

[ordered] sorgt dafür, dass die Einträge in der angegebenen
Reihenfolge verarbeitet werden.

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

17. Zielordner erstellen
========================

Die Zielordner werden nur im Echtmodus erstellt.

Die Abfrage lautet:

if (-not $Test)

-not kehrt den Wahrheitswert um.

Der Block wird deshalb nur ausgeführt, wenn der Testmodus nicht
aktiv ist.

Mit:

$kategorien.Keys

werden die Namen aller Kategorien ausgelesen.

Join-Path verbindet den Basisordner mit dem Kategorienamen:

$zielOrdner = Join-Path -Path $basisOrdner -ChildPath $kategorie

Test-Path prüft, ob der Ordner bereits existiert:

Test-Path -LiteralPath $zielOrdner -PathType Container

Fehlt der Ordner, wird er erstellt:

New-Item -ItemType Directory -Path $zielOrdner | Out-Null

Out-Null unterdrückt die zusätzliche Objektausgabe von New-Item.

In Version 1.0 werden im Echtmodus alle Kategorieordner erstellt.

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

18. Dateien mit Get-ChildItem erfassen
======================================

Die Dateien werden ausgelesen mit:

$dateien = Get-ChildItem -LiteralPath $basisOrdner -File

Get-ChildItem liest den Inhalt des Ordners aus.

-LiteralPath behandelt den angegebenen Pfad wörtlich.

-File sorgt dafür, dass nur Dateien zurückgegeben werden.

Unterordner werden nicht durchsucht, weil kein -Recurse verwendet
wird.

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

19. Passende Dateien mit Where-Object filtern
=============================================

Für jede Kategorie werden die passenden Dateien ausgewählt:

$passendeDateien = $dateien | Where-Object {
    $_.Extension.ToLowerInvariant() -in $erweiterungen
}

Die Pipeline übergibt die Dateien an Where-Object.

$_ steht für die Datei, die gerade geprüft wird.

.Extension liefert ihre Dateiendung.

Beispiel:

.jpg

ToLowerInvariant() wandelt die Endung in Kleinbuchstaben um.

Dadurch werden auch Endungen wie .JPG passend erkannt.

-in prüft, ob die Endung im Array der aktuellen Kategorie
enthalten ist.

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

20. Zielpfade mit Join-Path bilden
=================================

Der Zielordner wird gebildet mit:

$zielOrdner = Join-Path -Path $basisOrdner -ChildPath $kategorie

Der vollständige Zielpfad einer Datei wird gebildet mit:

$zielDatei = Join-Path -Path $zielOrdner -ChildPath $datei.Name

Beispiel:

Basisordner:

C:\Test

Kategorie:

01_Bilder

Dateiname:

urlaub.jpg

Ergebnis:

C:\Test\01_Bilder\urlaub.jpg

Der vollständige Zielpfad wird für die Konfliktprüfung verwendet.

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

21. Vorhandene Zieldateien schützen
===================================

Vor dem Verschieben wird geprüft:

if (Test-Path -LiteralPath $zielDatei)

Existiert die Zieldatei bereits, wird die Quelldatei
übersprungen.

Im Testmodus erscheint:

WÜRDE ÜBERSPRINGEN

Im Echtmodus erscheint:

ÜBERSPRUNGEN

Die vorhandene Datei wird nicht überschrieben.

Die Quelldatei wird nicht automatisch umbenannt.

Der Zähler wird erhöht mit:

$anzahlUebersprungen++

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

22. Dateien mit Move-Item verschieben
=====================================

Im Echtmodus wird eine passende Datei verschoben mit:

Move-Item -LiteralPath $datei.FullName -Destination $zielOrdner

$datei.FullName enthält den vollständigen Quellpfad.

$zielOrdner enthält den Kategorienordner.

Anschließend wird eine Erfolgsmeldung ausgegeben und der Zähler
erhöht:

$anzahlVerschoben++

Im Testmodus wird Move-Item nicht ausgeführt.

Stattdessen erscheint nur:

WÜRDE VERSCHIEBEN

Version 1.0 enthält für Move-Item noch keinen try/catch-Block.

Wenn PowerShell beim Verschieben einen Fehler meldet, muss die
Fehlermeldung direkt im Fenster geprüft werden.

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

23. Zähler und Zusammenfassung
==============================

Die Skripte verwenden:

$anzahlVerschoben
$anzahlUebersprungen

Im Testmodus bedeutet $anzahlVerschoben:

Anzahl der Dateien, die verschoben würden.

Im Echtmodus bedeutet die Variable:

Anzahl der vom Ablauf als verschoben behandelten Dateien.

$anzahlUebersprungen erfasst Dateien, bei denen im Ziel bereits
eine gleichnamige Datei erkannt wurde.

Unbekannte Dateitypen werden in Version 1.0 nicht mitgezählt.

Ein separater Fehlerzähler ist in dieser Version nicht enthalten.

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

24. Das Protokoll
=================

Das Protokoll beginnt als leeres Array:

$protokoll = @()

Neue Meldungen werden angehängt mit:

$protokoll += $meldung

Am Ende werden alle Einträge verbunden:

$protokollText = $protokoll -join [Environment]::NewLine

-join verbindet mehrere Elemente.

[Environment]::NewLine setzt dazwischen passende
Zeilenumbrüche.

Die SendTo-Version verwendet zusätzlich:

$gesamtProtokoll = @()

Darin werden die Protokolle aller verarbeiteten Ordner gesammelt.

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

25. Optionale Ausgabe aktivieren
================================

Standardmäßig ist nur die Bildschirmausgabe aktiv:

$logDateiErstellen = $false
$zwischenablageVerwenden = $false

Für eine Logdatei:

$logDateiErstellen = $true
$zwischenablageVerwenden = $false

Nur für die Zwischenablage:

$logDateiErstellen = $false
$zwischenablageVerwenden = $true

Für Logdatei und Zwischenablage:

$logDateiErstellen = $true
$zwischenablageVerwenden = $true

Immer nur eine der vorbereiteten Varianten sollte aktiv gelassen
werden.

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

26. Logdatei erstellen
======================

Der Dateiname enthält einen Zeitstempel:

$zeitstempel = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"

Daraus entsteht zum Beispiel:

sortierprotokoll_2026-08-03_14-30-25.log

Die Logdatei wird geschrieben mit:

$protokollText | Set-Content -LiteralPath $logDatei -Encoding UTF8

Die einfache Variante speichert die Logdatei im aktuellen
Basisordner.

Die SendTo-Version kann für jeden verarbeiteten Ordner eine eigene
Logdatei erstellen.

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

27. Zwischenablage verwenden
============================

Die einfache Variante kopiert ihr Protokoll mit:

$protokollText | Set-Clipboard

Die SendTo-Version sammelt zuerst alle Einzelprotokolle.

Danach wird das Gesamtprotokoll kopiert:

$gesamtProtokollText | Set-Clipboard

Bei mehreren übergebenen Ordnern enthält die Zwischenablage
dadurch die Ergebnisse aller Ordner.

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

28. Typische Meldungen
======================

Testmodus:

WÜRDE VERSCHIEBEN:
Die Datei würde bei der echten Ausführung verschoben.

WÜRDE ÜBERSPRINGEN:
Im Zielordner existiert bereits eine gleichnamige Datei.

Es wurden keine Dateien verschoben und keine Ordner erstellt:
Der Testmodus hat den Ordner nicht verändert.


Echtmodus:

VERSCHOBEN:
Das Skript hat den Verschiebebefehl für die Datei ausgeführt.

ÜBERSPRUNGEN:
Im Zielordner wurde eine gleichnamige Datei erkannt.

Abgebrochen:
Bei der Sicherheitsabfrage wurde nicht exakt JA eingegeben.

Dieser Ordner wurde übersprungen:
Bei der SendTo-Variante wurde die Verarbeitung dieses Ordners
nicht bestätigt.

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

29. Typische Fehler und Lösungen
================================

PowerShell 7 wurde nicht gefunden
---------------------------------

Die Starterdateien verwenden:

pwsh

Prüfe, ob PowerShell 7 installiert ist.

Starte gegebenenfalls eine neue Eingabeaufforderung oder Windows
neu, damit ein aktualisierter PATH übernommen wird.


PowerShell-Datei wurde nicht gefunden
-------------------------------------

Die PowerShell-Datei und ihre Starter-Batchdatei müssen im
gleichen Ordner liegen.

Die Dateinamen müssen exakt mit den Namen im Startercode
übereinstimmen.


SendTo-Datei wurde direkt gestartet
-----------------------------------

Beim Doppelklick wurden keine Ordnerpfade übergeben.

Die SendTo-Variante sollte über:

Rechtsklick
Senden an

gestartet werden.


Eine einzelne Datei wurde übergeben
-----------------------------------

Die SendTo-Version dieses Kursteils verarbeitet Ordner.

Einzelne Dateien werden als ungültige Eingabe übersprungen.


Eine Datei wurde nicht sortiert
-------------------------------

Prüfe, ob ihre Dateiendung in $kategorien eingetragen ist.

Unbekannte Dateitypen bleiben in Version 1.0 ohne zusätzliche
Meldung im Ausgangsordner liegen.


Eine Datei wurde übersprungen
-----------------------------

Im Zielordner existiert bereits eine Datei mit demselben Namen.

Die vorhandene Datei wird nicht überschrieben.

Die Quelldatei wird nicht automatisch umbenannt.


Alle Kategorieordner wurden erstellt
------------------------------------

Das ist in Version 1.0 vorgesehen.

Im Echtmodus werden alle in der Hashtable eingetragenen
Kategorieordner erstellt.


Keine Logdatei wurde erstellt
-----------------------------

Die Logausgabe ist standardmäßig ausgeschaltet.

Aktiviere eine Variante mit:

$logDateiErstellen = $true


Ein Fehler beim Verschieben wurde angezeigt
-------------------------------------------

Version 1.0 enthält noch keine eigene Fehlerbehandlung mit try
und catch.

Prüfe deshalb die direkt von PowerShell ausgegebene
Fehlermeldung.

Mögliche Ursachen sind:

* fehlende Schreibrechte
* eine geöffnete oder gesperrte Datei
* ein nicht erreichbarer Ordner
* ein ungültiger Pfad
* ein schreibgeschützter Datenträger

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

30. Wichtige PowerShell-Begriffe
================================

param
Definiert die Parameter des PowerShell-Skripts.

[switch]$Test
Schalter für den Testmodus.

[string[]]$Ordner
Array für mehrere übergebene Ordnerpfade.

ValueFromRemainingArguments
Sammelt verbleibende Startargumente im benannten Parameter.

Write-Host
Gibt Text im PowerShell-Fenster aus.

Read-Host
Liest eine Eingabe ein.

Get-Location
Liefert den aktuellen Arbeitsordner.

Resolve-Path
Ermittelt den vollständigen Pfad eines vorhandenen Elements.

[ordered]@{}
Erstellt eine geordnete Hashtable.

@()
Erstellt ein Array.

foreach
Verarbeitet mehrere Einträge nacheinander.

if / else
Führt abhängig von einer Bedingung unterschiedliche Blöcke aus.

Where-Object
Filtert Objekte anhand einer Bedingung.

$_
Aktuelles Objekt innerhalb einer Pipeline.

.Extension
Liefert die Dateiendung.

ToLowerInvariant()
Wandelt Text unabhängig von Spracheinstellungen in
Kleinbuchstaben um.

-in
Prüft, ob ein Wert in einer Sammlung enthalten ist.

Get-ChildItem
Liest den Inhalt eines Ordners aus.

-LiteralPath
Behandelt einen Pfad wörtlich.

-File
Beschränkt Get-ChildItem auf Dateien.

Join-Path
Verbindet Bestandteile zu einem Pfad.

Test-Path
Prüft, ob eine Datei oder ein Ordner existiert.

-PathType Container
Prüft, ob ein Pfad einen Ordner bezeichnet.

New-Item
Erstellt ein neues Element, hier einen Ordner.

Move-Item
Verschiebt eine Datei.

Out-Null
Unterdrückt eine nicht benötigte Ausgabe.

Set-Content
Schreibt Text in eine Datei.

Set-Clipboard
Kopiert Text in die Windows-Zwischenablage.

Get-Date
Liefert Datum und Uhrzeit.

-join
Verbindet mehrere Textelemente.

[Environment]::NewLine
Liefert einen passenden Zeilenumbruch.

continue
Springt zum nächsten Durchlauf einer Schleife.

exit
Beendet das PowerShell-Skript.

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

31. Wichtige Batch-Begriffe
===========================

@echo off
Blendet die ausgeführten Batchbefehle aus.

REM
Kennzeichnet eine Kommentarzeile.

chcp 65001
Stellt die Konsole auf UTF-8 um.

>nul
Unterdrückt eine Befehlsausgabe.

cd /d
Wechselt Ordner und bei Bedarf Laufwerk.

%~dp0
Laufwerk und Ordner der gestarteten Batchdatei.

%~n0
Name der gestarteten Batchdatei ohne Dateiendung.

find /i
Sucht unabhängig von Groß- und Kleinschreibung.

errorlevel
Enthält den Rückgabestatus des vorherigen Befehls.

pwsh
Startet PowerShell 7.

-ExecutionPolicy Bypass
Umgeht die Ausführungsrichtlinie nur für diesen einzelnen Start.

-File
Gibt die auszuführende PowerShell-Datei an.

%*
Enthält alle an die Batchdatei übergebenen Argumente.

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

32. Was haben wir gelernt?
==========================

* Testmodus mit [switch]$Test steuern
* aktuellen Arbeitsordner mit Get-Location ermitteln
* mehrere Ordner in [string[]]$Ordner entgegennehmen
* verbleibende Argumente mit ValueFromRemainingArguments sammeln
* Kategorien in einer geordneten Hashtable speichern
* Dateien mit Get-ChildItem erfassen
* Dateiendungen mit .Extension auslesen
* Dateien mit Where-Object filtern
* Pfade mit Join-Path zusammensetzen
* Ordner und Dateien mit Test-Path prüfen
* Zielordner mit New-Item erstellen
* Dateien mit Move-Item verschieben
* vorhandene Zieldateien vor dem Überschreiben schützen
* Meldungen in einem Array sammeln
* ein Protokoll mit -join zusammensetzen
* eine Logdatei mit Set-Content schreiben
* Text mit Set-Clipboard in die Zwischenablage kopieren
* mehrere SendTo-Ordner mit foreach verarbeiten
* alle Batchargumente mit %* weitergeben

Nicht Bestandteil der Version 1.0 sind:

* try und catch
* -ErrorAction Stop
* ein separater Fehlerzähler
* eine Meldung für unbekannte Dateitypen
* die Variablen $Elemente oder $args

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

33. Kurzfassung
===============

Einfache Variante:

1. Beide Dateien aus 01_Einfach in einen Testordner kopieren.
2. Die Starter-Batchdatei mit _test im Namen starten.
3. Die angezeigten geplanten Aktionen prüfen.
4. Für den Echtmodus _test aus dem Namen entfernen.
5. Die Starterdatei erneut ausführen.
6. Zum Bestätigen exakt JA eingeben.


SendTo-Variante:

1. Beide Dateien dauerhaft gemeinsam in einem Ordner speichern.
2. Eine Verknüpfung zur SendTo-_test.bat anlegen.
3. Die Verknüpfung in shell:sendto ablegen.
4. Einen oder mehrere Testordner im Explorer markieren.
5. Die Ordner über "Senden an" an das Skript übergeben.
6. Die angezeigten geplanten Aktionen prüfen.
7. Für den Echtmodus die Starterdatei umbenennen.
8. Die SendTo-Verknüpfung bei Bedarf aktualisieren.
9. Die Ordner erneut übergeben.
10. Jeden gewünschten Ordner einzeln mit JA bestätigen.

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

TOPTORIALS OFFICE
PowerShell 7 Grundkurs
Teil 004 - Dateien nach Typ sortieren
Version 1.0