Musiksortierung
Ordner voller Musikdateien nach dem Schema "Künstler - Titel" in Unterordner schieben... Tracknummern vorab ignoriert...
Also "%artist - %track" oder "%tracknumber. %artist - %track" zu "%artist\" ohne Umbenennung der Files...
# Musikdateien nach Künstler sortieren
# Unterstützt Formate: "Tracknummer - Künstler - Titel" oder "Künstler - Titel"
# Musik-Dateierweiterungen
$musikErweiterungen = @('.mp3', '.flac', '.m4a', '.wav', '.ogg', '.wma', '.aac')
# Funktion zum Bereinigen von Dateinamen für Ordner
function Get-CleanFolderName {
param($name)
# Entferne ungültige Zeichen für Ordnernamen
$invalid = [System.IO.Path]::GetInvalidFileNameChars()
$cleanName = $name
foreach ($char in $invalid) {
$cleanName = $cleanName.Replace([string]$char, '')
}
return $cleanName.Trim()
}
# Benutzer nach Quellordner fragen
Write-Host "=== Musikdateien-Sortierer ===" -ForegroundColor Cyan
Write-Host ""
$quellOrdner = Read-Host "Bitte gib den Pfad zum zu sortierenden Ordner ein"
# Prüfe ob Ordner existiert
if (-not (Test-Path $quellOrdner)) {
Write-Host "FEHLER: Der angegebene Ordner existiert nicht!" -ForegroundColor Red
Read-Host "Drücke Enter zum Beenden"
exit
}
# Hole alle Musikdateien im Hauptordner (nicht in Unterordnern)
$dateien = Get-ChildItem -Path $quellOrdner -File | Where-Object {
$musikErweiterungen -contains $_.Extension.ToLower()
}
if ($dateien.Count -eq 0) {
Write-Host "Keine Musikdateien im Ordner gefunden." -ForegroundColor Yellow
Read-Host "Drücke Enter zum Beenden"
exit
}
Write-Host ""
Write-Host "Gefundene Musikdateien: $($dateien.Count)" -ForegroundColor Green
Write-Host ""
# Analysiere Dateien und zeige Vorschau
$verschiebePlan = @()
foreach ($datei in $dateien) {
$dateiName = [System.IO.Path]::GetFileNameWithoutExtension($datei.Name)
$kuenstler = $null
# Versuche Format "Tracknummer - Künstler - Titel" (z.B. "01 - Beatles - Hey Jude")
if ($dateiName -match '^(\d+)\s*-\s*(.+?)\s*-\s*(.+)$') {
$kuenstler = $matches[2].Trim()
}
# Versuche Format "Künstler - Titel" (z.B. "Beatles - Hey Jude")
elseif ($dateiName -match '^(.+?)\s*-\s*(.+)$') {
$kuenstler = $matches[1].Trim()
}
if ($kuenstler) {
$kuenstlerOrdner = Get-CleanFolderName $kuenstler
$verschiebePlan += [PSCustomObject]@{
Datei = $datei.Name
Kuenstler = $kuenstlerOrdner
QuellPfad = $datei.FullName
}
} else {
Write-Host "WARNUNG: Kann Künstler nicht ermitteln für: $($datei.Name)" -ForegroundColor Yellow
}
}
if ($verschiebePlan.Count -eq 0) {
Write-Host "Keine Dateien mit erkennbarem Format gefunden." -ForegroundColor Yellow
Read-Host "Drücke Enter zum Beenden"
exit
}
# Zeige Vorschau gruppiert nach Künstler
Write-Host "Vorschau der Sortierung:" -ForegroundColor Cyan
Write-Host ("=" * 60)
$verschiebePlan | Group-Object Kuenstler | Sort-Object Name | ForEach-Object {
Write-Host "`n[$($_.Name)]" -ForegroundColor Green
$_.Group | ForEach-Object {
Write-Host " - $($_.Datei)" -ForegroundColor Gray
}
}
Write-Host "`n" ("=" * 60)
Write-Host ""
# Bestätigung einholen
$bestaetigung = Read-Host "Möchtest du diese $($verschiebePlan.Count) Datei(en) sortieren? (J/N)"
if ($bestaetigung -notmatch '^[jJyY]') {
Write-Host "Vorgang abgebrochen." -ForegroundColor Yellow
Read-Host "Drücke Enter zum Beenden"
exit
}
# Dateien verschieben
Write-Host ""
Write-Host "Sortiere Dateien..." -ForegroundColor Cyan
$erfolg = 0
$fehler = 0
foreach ($eintrag in $verschiebePlan) {
try {
$zielOrdner = Join-Path $quellOrdner $eintrag.Kuenstler
# Erstelle Künstler-Ordner falls nicht vorhanden
if (-not (Test-Path $zielOrdner)) {
New-Item -Path $zielOrdner -ItemType Directory -Force | Out-Null
}
$zielPfad = Join-Path $zielOrdner (Split-Path $eintrag.QuellPfad -Leaf)
# Verschiebe Datei
Move-Item -Path $eintrag.QuellPfad -Destination $zielPfad -Force
Write-Host "✓ $($eintrag.Datei) -> $($eintrag.Kuenstler)\" -ForegroundColor Green
$erfolg++
}
catch {
Write-Host "✗ FEHLER bei $($eintrag.Datei): $($_.Exception.Message)" -ForegroundColor Red
$fehler++
}
}
# Zusammenfassung
Write-Host ""
Write-Host ("=" * 60)
Write-Host "Fertig!" -ForegroundColor Cyan
Write-Host "Erfolgreich sortiert: $erfolg" -ForegroundColor Green
if ($fehler -gt 0) {
Write-Host "Fehler: $fehler" -ForegroundColor Red
}
Write-Host ("=" * 60)
Read-Host "`nDrücke Enter zum Beenden"