TOPTORIALS OFFICE - PowerShell 7 Grundkurs
Script: 007_Zeitstempel_im_Dateinamen
Titel: PowerShell 7 Grundkurs Teil 007: Zeitstempel hinzufügen und entfernen
Autor: Chris
YouTube: https://www.youtube.com/@TOPTORIALS-OFFICE
Webseite: https://www.toptorials.com
Version: 1.0
Letzte Aktualisierung: 2026-08-21

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

1. Was machen diese Scripte?
============================

Diese Scripte benennen Dateien mit PowerShell 7 um. Sie können
einen Zeitstempel vor vorhandene Dateinamen setzen und diesen
Zeitstempel später wieder entfernen.

Das verwendete Format lautet:

JJJJ-MM-TT_HH-MM-SS_Dateiname.ext

Beispiel vor dem Hinzufügen:

Rechnung.pdf

Beispiel nach dem Hinzufügen:

2026-08-21_14-35-42_Rechnung.pdf

Beispiel nach dem späteren Entfernen:

Rechnung.pdf

Es gibt vier Varianten:

01_Zeitstempel_im_Dateinamen
02_Zeitstempel_aus_Dateinamen_entfernen
03_SendTo_Zeitstempel_im_Dateinamen
04_SendTo_Zeitstempel_aus_Dateinamen_entfernen

Die ersten beiden Varianten werden zusammen mit den zu
bearbeitenden Dateien in denselben Ordner kopiert.

Die erste Variante fügt den direkt enthaltenen Dateien einen
Zeitstempel hinzu.

Die zweite Variante entfernt einen passenden Zeitstempel wieder
vom Anfang der direkt enthaltenen Dateinamen.

Die dritte und vierte Variante werden über das Windows-Menü
"Senden an" verwendet. Sie können einzelne Dateien, Ordner oder
eine gemischte Auswahl übernehmen.

Bei einem übergebenen Ordner werden ausschließlich die direkt darin
enthaltenen Dateien verarbeitet. Alle vier Varianten arbeiten
absichtlich nicht rekursiv.

Standardmäßig ist bei allen Varianten der sichere Testmodus aktiv.
Er zeigt nur an, was bei einer echten Ausführung passieren würde.

Im Testmodus werden:

* keine Dateien umbenannt
* keine Ordner umbenannt
* keine vorhandenen Elemente überschrieben
* alle geplanten Quell- und Zielpfade nur angezeigt

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

2. Voraussetzungen
===================

Benötigt werden:

* Windows 10 oder Windows 11
* PowerShell 7
* Schreibberechtigung für die zu bearbeitenden Dateien und Ordner

PowerShell 7 kann beispielsweise mit winget installiert werden:

winget install --id Microsoft.PowerShell --source winget

Nach der Installation sollte die Eingabeaufforderung neu gestartet
werden.

Mit folgendem Befehl kann geprüft werden, ob PowerShell 7 verfügbar
ist:

pwsh --version

Die Starter-Batchdateien verwenden den Befehl:

pwsh

Damit wird gezielt PowerShell 7 und nicht die ältere Windows
PowerShell 5.1 gestartet.

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

3. Empfohlener Speicherort
==========================

Der vollständige Kursordner kann unter diesem Pfad gespeichert
werden:

C:\TOPTORIALS_CODE\010_PowerShell_7_Grundkurs\007_Zeitstempel_im_Dateinamen

Darunter befinden sich die vier Varianten in getrennten Ordnern.

Für die beiden normalen Varianten werden die jeweils zusammen-
gehörenden PS1- und BAT-Dateien später gemeinsam in den Ordner
kopiert, dessen Dateien bearbeitet werden sollen.

Die Dateien der beiden SendTo-Varianten können dagegen dauerhaft
in ihren Kursordnern bleiben. In den Windows-SendTo-Ordner kommen
nur Verknüpfungen zu den jeweiligen Starter-Batchdateien.

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

4. Enthaltene Ordner und Dateien
================================

007_Zeitstempel_im_Dateinamen

01_Zeitstempel_im_Dateinamen
007_zeitstempel_im_dateinamen.ps1
007_zeitstempel_im_dateinamen_starter_batch_test.bat

02_Zeitstempel_aus_Dateinamen_entfernen
007_zeitstempel_aus_dateinamen_entfernen.ps1
007_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

03_SendTo_Zeitstempel_im_Dateinamen
007_sendto_zeitstempel_im_dateinamen.ps1
007_sendto_zeitstempel_im_dateinamen_starter_batch_test.bat

04_SendTo_Zeitstempel_aus_Dateinamen_entfernen
007_sendto_zeitstempel_aus_dateinamen_entfernen.ps1
007_sendto_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

README.txt

Die Dateien mit der Endung .ps1 enthalten die eigentliche
PowerShell-Logik.

Die Dateien mit der Endung .bat starten die passenden
PowerShell-Scripte und aktivieren abhängig vom eigenen Dateinamen
den Testmodus.

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

5. Wichtiger Sicherheitshinweis
===============================

Bitte die Scripte zuerst ausschließlich mit unwichtigen Testdateien
und Testordnern ausprobieren.

Die mitgelieferten Starter-Batchdateien tragen am Ende ihres Namens:

_test.bat

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

In diesem Modus wird nur angezeigt, welche Dateien bei einer echten
Ausführung umbenannt würden.

Erst wenn die Ausgabe vollständig geprüft wurde, kann _test aus dem
Namen der jeweiligen Starter-Batchdatei entfernt werden.

Beispiel für Variante 1:

Testmodus:
007_zeitstempel_im_dateinamen_starter_batch_test.bat

Echtmodus:
007_zeitstempel_im_dateinamen_starter_batch.bat

Beispiel für Variante 2:

Testmodus:
007_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

Echtmodus:
007_zeitstempel_aus_dateinamen_entfernen_starter_batch.bat

Beispiel für Variante 3:

Testmodus:
007_sendto_zeitstempel_im_dateinamen_starter_batch_test.bat

Echtmodus:
007_sendto_zeitstempel_im_dateinamen_starter_batch.bat

Beispiel für Variante 4:

Testmodus:
007_sendto_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

Echtmodus:
007_sendto_zeitstempel_aus_dateinamen_entfernen_starter_batch.bat

Im Echtmodus erscheint zusätzlich eine Sicherheitsabfrage.

Zum Fortfahren muss eingegeben werden:

JA

Groß- und Kleinschreibung wird bei dieser Prüfung von PowerShell
standardmäßig ignoriert. Deshalb werden beispielsweise auch diese
Eingaben akzeptiert:

ja
Ja
jA

Jede andere Eingabe bricht die Ausführung ab.

Trotz der eingebauten Schutzmaßnahmen sollte vor der Verwendung mit
wichtigen Dateien immer eine aktuelle Datensicherung vorhanden sein.

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

6. Wie wird der Zeitstempel gebildet?
=====================================

Die Erstellen-Varianten erzeugen den Zeitstempel mit:

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

Die Bestandteile bedeuten:

yyyy    Jahr mit vier Ziffern
MM      Monat mit zwei Ziffern
dd      Tag mit zwei Ziffern
HH      Stunde im 24-Stunden-Format
mm      Minute mit zwei Ziffern
ss      Sekunde mit zwei Ziffern

Beispiel:

2026-08-21_14-35-42

Der neue Name wird aus Zeitstempel, Unterstrich und bisherigem
Dateinamen gebildet:

$neuerName = $zeitstempel + "_" + $datei.Name

Der Zeitstempel wird einmal zu Beginn eines Scriptdurchlaufs
ermittelt. Deshalb erhalten alle in diesem Durchlauf verarbeiteten
Dateien denselben Zeitstempel.

Durch die Reihenfolge von Jahr, Monat, Tag, Stunde, Minute und
Sekunde lassen sich die Namen auch alphabetisch chronologisch
sortieren.

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

7. Welche Dateien werden ausgeschlossen?
=========================================

Folgende Dateiendungen werden absichtlich nicht verarbeitet:

.bat
.cmd
.ps1
.py
.log

Die Liste steht in allen vier PowerShell-Scripten in der Variablen:

$ausgeschlosseneEndungen

Dadurch werden insbesondere die PowerShell-Scripte, die
Starter-Batchdateien und mögliche Protokolldateien nicht selbst
umbenannt.

Die Prüfung mit -contains ignoriert in PowerShell standardmäßig die
Groß- und Kleinschreibung. Deshalb wird beispielsweise auch eine
Datei mit der Endung .PS1 erkannt und übersprungen.

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

8. Variante 1: Zeitstempel im aktuellen Ordner hinzufügen
==========================================================

Diese Variante befindet sich im Ordner:

01_Zeitstempel_im_Dateinamen

Darin liegen diese Dateien:

007_zeitstempel_im_dateinamen.ps1
007_zeitstempel_im_dateinamen_starter_batch_test.bat

Beide Dateien werden gemeinsam in den Ordner kopiert, dessen
Dateien einen Zeitstempel erhalten sollen.

Beispiel vor dem Umbenennen:

C:\Test\Rechnung.pdf
C:\Test\Bericht.docx
C:\Test\Foto.jpg

Empfohlener erster Start:

007_zeitstempel_im_dateinamen_starter_batch_test.bat

Die Starter-Batchdatei kann per Doppelklick gestartet werden.

Sie wechselt zuerst in ihren eigenen Ordner. Dieser Ordner wird
dadurch zum Arbeitsordner für das PowerShell-Script.

Im Testmodus werden beispielsweise diese Ziele angezeigt:

C:\Test\2026-08-21_14-35-42_Rechnung.pdf
C:\Test\2026-08-21_14-35-42_Bericht.docx
C:\Test\2026-08-21_14-35-42_Foto.jpg

Nach der Prüfung kann _test aus dem Namen der Starter-Batchdatei
entfernt und der Echtlauf gestartet werden.

Unterordner und die darin enthaltenen Dateien bleiben unverändert.

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

9. Variante 2: Zeitstempel im aktuellen Ordner entfernen
=========================================================

Diese Variante befindet sich im Ordner:

02_Zeitstempel_aus_Dateinamen_entfernen

Darin liegen diese Dateien:

007_zeitstempel_aus_dateinamen_entfernen.ps1
007_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

Beide Dateien werden gemeinsam in den Ordner mit den Dateien
kopiert, deren Zeitstempel entfernt werden sollen.

Beispiel vor dem Entfernen:

C:\Test\2026-08-21_14-35-42_Rechnung.pdf
C:\Test\2026-08-21_14-35-42_Bericht.docx

Empfohlener erster Start:

007_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

Das Script erkennt einen passenden Zeitstempel am Anfang des
Dateinamens und entfernt ihn aus dem geplanten Zielnamen.

Beispiel nach der echten Ausführung:

C:\Test\Rechnung.pdf
C:\Test\Bericht.docx

Dateien ohne passenden Zeitstempel am Anfang werden übersprungen.

Unterordner und die darin enthaltenen Dateien bleiben unverändert.

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

10. Wie wird ein vorhandener Zeitstempel erkannt?
==================================================

Die Scripte verwenden reguläre Ausdrücke.

Beim Hinzufügen lautet das Muster:

'^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}_'

Das Zeichen ^ verlangt, dass der Treffer direkt am Anfang des
Dateinamens steht.

\d{4} steht für vier Ziffern. \d{2} steht für zwei Ziffern.

Beginnt ein Dateiname bereits mit diesem Muster, wird er von den
Erstellen-Varianten übersprungen. Dadurch wird nicht versehentlich
ein zweiter Zeitstempel vorangestellt.

Beim Entfernen lautet das Muster:

'^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}_?'

Das Fragezeichen hinter dem letzten Unterstrich macht diesen
Unterstrich optional.

Dadurch werden beide Schreibweisen erkannt:

2026-08-21_14-35-42_Rechnung.pdf
2026-08-21_14-35-42Rechnung.pdf

Das Muster prüft die Schreibweise und die Anzahl der Ziffern. Es
führt keine vollständige Kalenderprüfung durch. Eine Ziffernfolge
im passenden Aufbau kann deshalb auch dann erkannt werden, wenn sie
kein tatsächlich gültiges Datum darstellt.

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

11. Schutz vor Namenskonflikten beim Entfernen
==============================================

Beim Entfernen eines Zeitstempels kann der geplante ursprüngliche
Dateiname bereits vorhanden sein.

Beispiel:

Rechnung.pdf
2026-08-21_14-35-42_Rechnung.pdf

Die vorhandene Datei Rechnung.pdf wird nicht überschrieben.

Die Funktion Get-FreierZielName sucht stattdessen automatisch einen
freien Namen mit einer dreistelligen Nummer.

Beispiele:

Rechnung_001.pdf
Rechnung_002.pdf
Rechnung_003.pdf

Die Nummer wird mit dieser Schreibweise dreistellig formatiert:

$nummer.ToString("D3")

Zusätzlich speichern die Entfernen-Varianten bereits geplante
Zielpfade in einem HashSet[string].

Dadurch werden nicht nur vorhandene Dateien berücksichtigt. Auch
zwei verschiedene Quelldateien können innerhalb desselben
Durchlaufs nicht versehentlich denselben Zielnamen erhalten.

Der Vergleich der reservierten Ziele ignoriert Groß- und
Kleinschreibung.

Sollte nach dem Entfernen des Zeitstempels kein Basisname übrig
bleiben, verwendet das Script als Ersatz:

Unbenannt

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

12. Variante 3: Zeitstempel über SendTo hinzufügen
==================================================

Diese Variante befindet sich im Ordner:

03_SendTo_Zeitstempel_im_Dateinamen

Darin liegen diese Dateien:

007_sendto_zeitstempel_im_dateinamen.ps1
007_sendto_zeitstempel_im_dateinamen_starter_batch_test.bat

Die Variante übernimmt über das Windows-Menü "Senden an":

* einzelne Dateien
* mehrere Dateien
* einen oder mehrere Ordner
* eine gemischte Auswahl aus Dateien und Ordnern

Bei einer direkt übergebenen Datei wird genau diese Datei geprüft.

Bei einem übergebenen Ordner werden die direkt enthaltenen Dateien
geprüft. Weitere Unterordner werden nicht durchsucht.

Eine Laufwerkswurzel wie C:\ wird aus Sicherheitsgründen nicht als
Ordner verarbeitet.

Jede gültige Datei erhält den gemeinsamen Zeitstempel des aktuellen
Scriptdurchlaufs in ihrem eigenen Ordner.

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

13. Variante 4: Zeitstempel über SendTo entfernen
=================================================

Diese Variante befindet sich im Ordner:

04_SendTo_Zeitstempel_aus_Dateinamen_entfernen

Darin liegen diese Dateien:

007_sendto_zeitstempel_aus_dateinamen_entfernen.ps1
007_sendto_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

Auch diese Variante akzeptiert einzelne Dateien, mehrere Dateien,
Ordner oder eine gemischte Auswahl.

Bei jeder erfassten Datei wird geprüft, ob ihr Name mit einem
passenden Zeitstempel beginnt.

Wird ein Zeitstempel gefunden, entfernt das Script diesen aus dem
Basisnamen. Die ursprüngliche Dateiendung bleibt erhalten.

Die Funktion Get-FreierZielName schützt vorhandene Dateien und
bereits geplante Ziele. Bei einem Namenskonflikt wird automatisch
ein freier Name mit _001, _002 und so weiter gebildet.

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

14. Doppelte Übergaben bei den SendTo-Varianten
================================================

Die SendTo-Varianten entfernen zunächst doppelt übergebene
Argumente mit:

Select-Object -Unique

Zusätzlich speichern sie bereits erfasste Dateien in der Hashtable:

$bereitsErfassteDateien

Das ist beispielsweise wichtig, wenn gleichzeitig ein Ordner und
eine direkt darin enthaltene Datei markiert und übergeben werden.

Ohne die zusätzliche Prüfung könnte dieselbe Datei einmal als
Einzeldatei und ein zweites Mal über den Ordnerinhalt erfasst werden.

Der vollständige Dateipfad wird mit ToLowerInvariant() in eine
einheitliche Vergleichsform gebracht. Die Originalpfade und
Dateinamen werden dadurch nicht verändert.

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

15. SendTo-Verknüpfungen einrichten
===================================

Für die beiden SendTo-Varianten wird jeweils eine Verknüpfung zur
passenden Starter-Batchdatei im SendTo-Ordner von Windows angelegt.

Den SendTo-Ordner öffnen:

1. Windows-Taste und R drücken
2. shell:sendto eingeben
3. Enter drücken

Verknüpfung zum Hinzufügen:

C:\TOPTORIALS_CODE\010_PowerShell_7_Grundkurs\007_Zeitstempel_im_Dateinamen\03_SendTo_Zeitstempel_im_Dateinamen\007_sendto_zeitstempel_im_dateinamen_starter_batch_test.bat

Möglicher Name der Verknüpfung:

Zeitstempel hinzufügen - TEST

Verknüpfung zum Entfernen:

C:\TOPTORIALS_CODE\010_PowerShell_7_Grundkurs\007_Zeitstempel_im_Dateinamen\04_SendTo_Zeitstempel_aus_Dateinamen_entfernen\007_sendto_zeitstempel_aus_dateinamen_entfernen_starter_batch_test.bat

Möglicher Name der Verknüpfung:

Zeitstempel entfernen - TEST

Danach erscheinen die Verknüpfungen im Windows-Explorer unter:

Rechtsklick auf markierte Dateien oder Ordner
Senden an

Wichtig:

Die eigentliche PowerShell-Datei und die Starter-Batchdatei müssen
an ihrem festen Speicherort zusammenbleiben.

In den SendTo-Ordner gehören nur die Verknüpfungen zu den beiden
Starter-Batchdateien.

Nach dem Test kann _test aus dem Namen der jeweiligen
Starter-Batchdatei entfernt werden. Anschließend muss das Ziel der
zugehörigen SendTo-Verknüpfung geprüft oder die Verknüpfung neu
erstellt werden.

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

16. Wie funktionieren die Umbenennungspläne?
============================================

Die Scripte benennen gefundene Dateien nicht sofort um.

Zuerst werden alle Dateien geprüft. Jede gültige geplante
Umbenennung wird als PSCustomObject in der Liste $plaene gespeichert.

Ein Plan enthält:

* den vollständigen Quellpfad
* den bisherigen Dateinamen
* den neuen Dateinamen
* den vollständigen Zielpfad

Der grundsätzliche Aufbau sieht so aus:

$plaene += [PSCustomObject]@{
    Quelle    = $datei.FullName
    AlterName = $datei.Name
    NeuerName = $neuerName
    Ziel      = $zielPfad
}

Dadurch sind Planung und tatsächliche Ausführung voneinander
getrennt.

Im Testmodus werden die gespeicherten Pläne nur angezeigt.

Im Echtmodus erscheint zuerst die gemeinsame Sicherheitsabfrage.
Erst nach der Bestätigung werden die Pläne nacheinander mit
Rename-Item ausgeführt.

Diese Art der Planung ist besonders hilfreich, weil vor der ersten
echten Änderung bereits feststeht, welche gültigen Umbenennungen
vorgesehen sind.

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

17. Zusätzliche Ausgabe einstellen
==================================

Standardmäßig wird nur eine Bildschirmausgabe erstellt:

$logDateiErstellen = $false
$zwischenablageVerwenden = $false

Alternativ stehen vier Ausgabemöglichkeiten zur Verfügung:

Variante 1: Nur Bildschirmausgabe

$logDateiErstellen = $false
$zwischenablageVerwenden = $false

Variante 2: Logdatei erstellen

$logDateiErstellen = $true
$zwischenablageVerwenden = $false

Variante 3: Nur in die Zwischenablage kopieren

$logDateiErstellen = $false
$zwischenablageVerwenden = $true

Variante 4: Logdatei und Zwischenablage verwenden

$logDateiErstellen = $true
$zwischenablageVerwenden = $true

Immer nur die gewünschte Kombination aktiv lassen.

Die Logdateien erhalten einen eigenen Zeitstempel, damit vorhandene
Protokolle nicht überschrieben werden.

Beispiele:

umbenennprotokoll_zeitstempel_setzen_2026-08-21_14-40-05.log
umbenennprotokoll_zeitstempel_entfernen_2026-08-21_14-42-17.log
umbenennprotokoll_sendto_zeitstempel_setzen_2026-08-21_14-45-03.log
umbenennprotokoll_sendto_zeitstempel_entfernen_2026-08-21_14-47-26.log

Bei den ersten beiden Varianten wird das Protokoll im bearbeiteten
Ordner gespeichert.

Bei den SendTo-Varianten wird das Protokoll im Ordner des jeweiligen
PowerShell-Scripts gespeichert.

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

18. Mehrzeilige Ausgabe bei langen Pfaden
=========================================

Quell- und Zielpfad werden bei geplanten und ausgeführten
Umbenennungen auf getrennten Zeilen angezeigt.

Beispiel im Testmodus:

WÜRDE UMBENENNEN:
Quelle: "C:\Test\Rechnung.pdf"
Ziel:   "C:\Test\2026-08-21_14-35-42_Rechnung.pdf"
---

Beispiel im Echtmodus:

UMBENANNT:
Quelle: "C:\Test\2026-08-21_14-35-42_Rechnung.pdf"
Ziel:   "C:\Test\Rechnung.pdf"
---

Innerhalb eines PowerShell-Textes erzeugt diese Schreibweise einen
Zeilenumbruch:

`n

Die mehrzeilige Darstellung ist besonders bei langen Windows-Pfaden
übersichtlicher als eine einzige lange Ausgabezeile.

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

19. Typische Bildschirmausgaben
===============================

Im Testmodus:

WÜRDE UMBENENNEN

Die Datei wurde nur geprüft. Sie wurde nicht verändert.

Im Echtmodus:

UMBENANNT

Die Datei wurde erfolgreich umbenannt.

Bei einer Schutzprüfung:

ÜBERSPRUNGEN

Die Datei beziehungsweise der übergebene Pfad wurde absichtlich
nicht verändert. Mögliche Gründe sind:

* die Dateiendung ist ausgeschlossen
* beim Hinzufügen ist bereits ein Zeitstempel vorhanden
* beim Entfernen wurde kein Zeitstempel am Anfang gefunden
* eine Datei oder ein Ordner wurde nicht gefunden
* eine Laufwerkswurzel wurde übergeben

Bei einem technischen Problem:

FEHLER

Mögliche Ursachen sind beispielsweise:

* fehlende Zugriffsrechte
* eine Datei wird von einem anderen Programm verwendet
* ein Ordner oder eine Datei wurde zwischenzeitlich verschoben
* der Pfad ist nicht mehr verfügbar

Am Ende zeigt jedes Script eine Zusammenfassung mit der Anzahl der
geplanten beziehungsweise ausgeführten Umbenennungen, der
übersprungenen Dateien und der Fehler.

Die SendTo-Varianten zeigen zusätzlich die Anzahl der übergebenen
Einzeldateien und der verarbeiteten Ordner an.

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

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

Die eigentliche Logik steht in den PowerShell-Dateien mit der Endung
.ps1.

Die Batchdateien erleichtern den Start per Doppelklick und übernehmen
mehrere vorbereitende Aufgaben:

* UTF-8-Ausgabe mit chcp 65001
* Wechsel in den Ordner der Starter-Batchdatei
* Start über PowerShell 7 mit pwsh
* Erkennung des Testmodus über _test im eigenen Dateinamen
* Übergabe der ausgewählten Elemente bei den SendTo-Varianten

Die Starter-Batchdatei prüft mit:

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

ob ihr eigener Dateiname _test enthält.

Wenn _test gefunden wird, startet sie das PowerShell-Script mit dem
Argument:

-Test

Bei den SendTo-Varianten steht zusätzlich:

%*

Dieser Platzhalter übergibt alle vom Windows-Explorer empfangenen
Argumente an das PowerShell-Script.

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

21. Parameter und Argumente bei SendTo
======================================

Die SendTo-PowerShell-Scripte besitzen im Parameterblock:

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

$Elemente ist ein Parameter des PowerShell-Scripts.

Die konkreten Datei- und Ordnerpfade, die beim Aufruf übergeben
werden, sind die Argumente.

[string[]] bedeutet, dass der Parameter mehrere Texte und damit
mehrere Pfade als Array aufnehmen kann.

ValueFromRemainingArguments sorgt dafür, dass alle noch nicht
zugeordneten Argumente in $Elemente gesammelt werden.

Die Starter-Batchdatei reicht diese Argumente mit %* an das
PowerShell-Script weiter.

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

22. Wichtige PowerShell-Befehle und Begriffe
============================================

Get-Date -Format

Erzeugt Datum und Uhrzeit in einem festgelegten Textformat.

Get-Location

Liefert den aktuellen Arbeitsordner. Die ersten beiden Varianten
verwenden diesen als zu bearbeitenden Ordner.

$PSScriptRoot

Liefert den Speicherordner des PowerShell-Scripts. Die SendTo-
Varianten speichern dort mögliche Logdateien.

Get-ChildItem -File

Liest die direkt enthaltenen Dateien eines Ordners ein.

Get-Item

Liest bei den SendTo-Varianten einen übergebenen Pfad als
PowerShell-Objekt ein.

-LiteralPath

Behandelt einen Pfad wörtlich. Sonderzeichen im Pfad werden dadurch
nicht als Platzhalter interpretiert.

-Force

Bezieht auch versteckte Elemente in die Ermittlung ein, sofern der
Zugriff darauf möglich ist.

Test-Path

Prüft, ob eine Datei, ein Ordner oder ein geplanter Zielpfad
existiert.

Join-Path

Verbindet einen Ordnerpfad und einen Dateinamen zu einem
vollständigen Zielpfad.

-match und -notmatch

Prüfen, ob ein Text zu einem regulären Ausdruck passt oder nicht
passt.

[regex]::new

Erstellt ein Objekt für reguläre Ausdrücke.

Replace

Ersetzt den erkannten Zeitstempel durch einen leeren Text.

BaseName

Liefert den Dateinamen ohne Dateiendung.

Extension

Liefert die Dateiendung einschließlich des vorangestellten Punktes.

[string]::IsNullOrEmpty

Prüft, ob ein Text leer ist oder keinen Wert enthält.

HashSet[string]

Speichert eindeutige Texte. Die Entfernen-Varianten reservieren
damit bereits geplante Zielpfade.

ToString("D3")

Formatiert eine Zahl dreistellig mit führenden Nullen.

PSCustomObject

Speichert eine geplante Umbenennung mit Quelle, altem Namen, neuem
Namen und Zielpfad.

Rename-Item

Benennt im Echtmodus eine Datei um.

Select-Object -Unique

Entfernt bei den SendTo-Varianten doppelt übergebene Argumente.

ValueFromRemainingArguments

Sorgt dafür, dass die von der Starter-Batchdatei übergebenen Pfade
im Parameter $Elemente gesammelt werden.

PSIsContainer

Zeigt an, ob ein eingelesenes Element ein Ordner ist.

ToLowerInvariant()

Erstellt für die Dublettenprüfung eine einheitliche kleingeschriebene
Vergleichsform eines Pfades.

try und catch

Fangen Fehler kontrolliert ab. Das Script kann dadurch eine
verständliche Fehlermeldung ausgeben und weitere Dateien
verarbeiten.

Set-Content

Schreibt das optionale Protokoll als UTF-8-Text in eine Logdatei.

Set-Clipboard

Kopiert das optionale Protokoll in die Windows-Zwischenablage.

continue

Beendet den aktuellen Schleifendurchlauf und fährt mit dem nächsten
Element fort.

`n

Erzeugt innerhalb eines PowerShell-Textes einen Zeilenumbruch.

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

23. Empfohlener Testablauf
==========================

1. Einen neuen Ordner mit mehreren unwichtigen Testdateien anlegen.

2. Die beiden Dateien aus 01_Zeitstempel_im_Dateinamen gemeinsam
   in diesen Testordner kopieren.

3. Die Starter-Batchdatei zunächst mit _test im Namen starten.

4. Alle Meldungen mit WÜRDE UMBENENNEN sorgfältig prüfen.

5. _test entfernen, den Echtlauf starten und mit JA bestätigen.

6. Kontrollieren, ob alle erwarteten Dateien denselben Zeitstempel
   erhalten haben.

7. Die beiden Dateien aus
   02_Zeitstempel_aus_Dateinamen_entfernen in denselben Testordner
   kopieren.

8. Auch die Entfernen-Variante zuerst im Testmodus ausführen.

9. Prüfen, ob vorhandene Zielnamen mit _001, _002 und so weiter
   geschützt werden.

10. Erst danach die Entfernen-Variante im Echtmodus testen.

11. Für die dritte und vierte Variante die beiden SendTo-
    Verknüpfungen mit den Test-Starter-Batchdateien einrichten.

12. Zuerst einzelne Dateien, danach mehrere Dateien und anschließend
    einen Testordner über "Senden an" übergeben.

13. Zusätzlich eine gemischte Auswahl aus Dateien und Ordnern
    prüfen.

14. Kontrollieren, ob Dateien aus Unterordnern unverändert bleiben.

15. Die SendTo-Echtvarianten erst nach erfolgreicher Prüfung mit
    unwichtigen Testdaten verwenden.

16. Vor der späteren Verwendung mit wichtigen Daten eine aktuelle
    Datensicherung erstellen.

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

24. Wichtige Grenzen dieser Version
===================================

Diese Version wurde bewusst übersichtlich und einsteigerfreundlich
gehalten.

Die Scripte bieten absichtlich:

* keine Rückgängig-Funktion
* keine rekursive Verarbeitung tieferer Unterordner
* keine automatische Sicherung der umzubenennenden Dateien
* keine Filterung nach Dateigröße oder Änderungsdatum
* keine automatische Kürzung zu langer Datei- oder Pfadnamen
* keine vollständige Kalenderprüfung des erkannten Zeitstempels

Die Erstellen-Varianten überschreiben keine vorhandenen Ziele und
überspringen Dateien, die bereits mit einem passenden Zeitstempel
beginnen.

Die Entfernen-Varianten überschreiben ebenfalls keine vorhandenen
Ziele. Bei einem Konflikt erzeugen sie stattdessen automatisch einen
freien Namen mit einer dreistelligen Nummer.

Eine Umbenennung verändert normalerweise nicht den Inhalt einer
Datei. Programme, Verknüpfungen oder Projekte können jedoch auf
feste Dateinamen angewiesen sein. Das Umbenennen kann solche
Verknüpfungen ungültig machen.

Durch den zusätzlichen Zeitstempel wird der vollständige Pfad
länger. Bei bereits sehr langen Pfaden kann Windows oder ein
verwendetes Programm deshalb die Umbenennung ablehnen.

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

25. Haftungsausschluss
======================

Die Scripte werden zu Lern- und Demonstrationszwecken
bereitgestellt.

Die Verwendung erfolgt auf eigene Verantwortung.

Bitte alle Scripte zuerst mit unwichtigen Testdaten prüfen und vor
der Bearbeitung wichtiger Dateien eine vollständige Datensicherung
erstellen.

Für Datenverluste, fehlerhafte Umbenennungen, unterbrochene
Verknüpfungen oder sonstige Schäden wird keine Haftung übernommen.

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

26. Weitere Informationen
==========================

YouTube-Kanal:
https://www.youtube.com/@TOPTORIALS-OFFICE

Webseite:
https://www.toptorials.com
