23.11.2022, 20:37
(Dieser Beitrag wurde zuletzt bearbeitet: 23.11.2022, 20:38 von tomwatayan.)
1
Hier ist eine Variante in PowerShell, die das auch mit eckigen Klammern macht:
Die Datei rename_folders_by_parent.ps1 nennen und in das Zielverzeichnis, wo die Unterordner umbenannt werden sollen, hinkopieren.
Dann kann man das mit dem Aufruf in der ersten Kommentarzeile ausführen.
Weil du jetzt eventuell schon runde Klammern hast, benennt es auch runde Klammern in eckige um.
Mein Fazit zu PowerShell: Das ist auf jeden Fall angenehmer zu lesen als Batch. Aber auch in diesem kleinen anschaulichen Beispiel gab es zwei Verhaltensweisen, die mich kalt erwischt hatten (Rename-Item braucht -LiteralPath statt den Standard -Path, weil das sonst als RegEx interpretiert wird und -replace braucht auch ein Regex-Escape). Dennoch eine coole Erfindung. Und es kommt direkt mit allen möglichen Sonderzeichen klar. Ich weiß gar nicht, warum ich da so lange mit gezögert habe, das mal anzugucken. Von daher vielen Dank für diesen Anstoß mit der überschaubaren Aufgabe, damit ich mir das mal angucke.
Code:
# Aufruf mit powershell -ExecutionPolicy RemoteSigned -File rename_folders_by_parent.ps1
# Funktion benennt Ordner in einem Verzeichnis um.
function Rename-Folders-In-Directory {
param (
$rootDirectory,
$directory
)
# Alle Ordner auflisten
$directoryList = Get-ChildItem -LiteralPath $directory.FullName -directory
# Zuerst die inneren Ordner umbenennen
foreach ($childDirectory in $directoryList) {
Rename-Folders-In-Directory $rootDirectory $childDirectory
}
# Jeden Überordner bis zum Startverzeichnis in eckigen Klammern aneinanderketten
$parentDirectoryNames = ""
$parentDirectory = $directory.Parent
while ($parentDirectory.FullName -ne $rootDirectory.FullName) {
$parentDirectoryName = Get-Original-Directory-Name $parentDirectory $rootDirectory
$parentDirectoryNames = "[$parentDirectoryName] $parentDirectoryNames"
$parentDirectory = $parentDirectory.Parent
}
$parentDirectoryName = $parentDirectory.Name
$parentDirectoryNames = "[$parentDirectoryName] $parentDirectoryNames"
# Den ursprünglichen Ordnernamen hintendran setzen
$directoryName = Get-Original-Directory-Name $directory $rootDirectory
$newDirectoryName = "$parentDirectoryNames$directoryName"
# Umbenennen, wenn der Ordner nicht schon richtig heißt
if ($directory.Name -ne $newDirectoryName) {
Rename-Item -LiteralPath $directory.FullName -NewName $newDirectoryName
}
}
# Funktion liefert den ursprünglichen Ordnernamen ohne die hinzugefügten Überordner
function Get-Original-Directory-Name {
param (
$directory,
$rootDirectory
)
$directoryName = $directory.Name
$parentDirectory = $directory.Parent
# Suche rückwärts für jeden Ordnernamen immer zuerst den Elternordnernamen.
# Weil das Startverzeichnis nie umbenannt wird, bekommen wir irgendwann eine Konstante.
while ($parentDirectory.FullName -ne $rootDirectory.FullName) {
$parentDirectoryName = Get-Original-Directory-Name $parentDirectory $rootDirectory
# Entferne das Elternverzeichnis vom Ordnernamen
$directoryName = $directoryName -replace ([regex]::Escape('[' + $parentDirectoryName + '] ')),''
$directoryName = $directoryName -replace ([regex]::Escape('(' + $parentDirectoryName + ') ')),''
$parentDirectory = $parentDirectory.Parent
}
# Das Startverzeichnis hat immer einen Namen ohne eckige Klammern.
$rootDirectoryName = $rootDirectory.Name
# Entferne das Startverzeichnis vom Ordnernamen
$directoryName = $directoryName -replace ([regex]::Escape('[' + $rootDirectoryName + '] ')),''
$directoryName = $directoryName -replace ([regex]::Escape('(' + $rootDirectoryName + ') ')),''
return $directoryName
}
# Startverzeichnis einlesen
$rootDirectory = Get-Item .
$directoryList = Get-ChildItem . -directory
# Anfang der Schleife. Jeden Ordner umbenennen
foreach ($directory in $directoryList) {
Rename-Folders-In-Directory $rootDirectory $directory
}
Die Datei rename_folders_by_parent.ps1 nennen und in das Zielverzeichnis, wo die Unterordner umbenannt werden sollen, hinkopieren.
Dann kann man das mit dem Aufruf in der ersten Kommentarzeile ausführen.
Weil du jetzt eventuell schon runde Klammern hast, benennt es auch runde Klammern in eckige um.
Mein Fazit zu PowerShell: Das ist auf jeden Fall angenehmer zu lesen als Batch. Aber auch in diesem kleinen anschaulichen Beispiel gab es zwei Verhaltensweisen, die mich kalt erwischt hatten (Rename-Item braucht -LiteralPath statt den Standard -Path, weil das sonst als RegEx interpretiert wird und -replace braucht auch ein Regex-Escape). Dennoch eine coole Erfindung. Und es kommt direkt mit allen möglichen Sonderzeichen klar. Ich weiß gar nicht, warum ich da so lange mit gezögert habe, das mal anzugucken. Von daher vielen Dank für diesen Anstoß mit der überschaubaren Aufgabe, damit ich mir das mal angucke.