Fehler in Powershell: SortAlbumsByGenre per MP3TAG
Guten Tag,
da ich vor langer Zeit mal sehr gute Erfahrungen mit diesem Forum gemacht habe, richte ich mich heute wieder vertrauensvoll an die Windows-Experten unter euch:
Ich möchte in Windows automatisiert meine MP3-Albensammlung nach Genre sortieren. Dafür hat mir ChatGPT ein PowerShell-Script geschrieben, das mit der Freeware MP3TAG jeweils das Genre ausliest und in eine Textdatei schreibt, daraus einen neuen Ordner erstellt und den Ordner des jeweiligen Albums samt Inhalt da hinein verschiebt. Doch leider passiert nichts nach der Ausführung. Nur das Tool MP3TAG öffnet sich, sonst nichts.#
ChatGPT beschreibt den Workflow folgendermaßen:
Das Script sieht so aus:
Bin für jeden Hinweis dankbar.
Besten Gruß
da ich vor langer Zeit mal sehr gute Erfahrungen mit diesem Forum gemacht habe, richte ich mich heute wieder vertrauensvoll an die Windows-Experten unter euch:
Ich möchte in Windows automatisiert meine MP3-Albensammlung nach Genre sortieren. Dafür hat mir ChatGPT ein PowerShell-Script geschrieben, das mit der Freeware MP3TAG jeweils das Genre ausliest und in eine Textdatei schreibt, daraus einen neuen Ordner erstellt und den Ordner des jeweiligen Albums samt Inhalt da hinein verschiebt. Doch leider passiert nichts nach der Ausführung. Nur das Tool MP3TAG öffnet sich, sonst nichts.#
ChatGPT beschreibt den Workflow folgendermaßen:
Quelle: KI
- Das Skript durchläuft alle Ordner in Ihrer Musiksammlung.
- Für jeden Ordner wird Mp3tag aufgerufen, um das Genre zu ermitteln und in eine Textdatei zu schreiben.
- Das Skript liest das Genre aus der Textdatei.
- Ein entsprechender Genre-Ordner wird erstellt, falls er noch nicht existiert.
- Der Album-Ordner wird in den passenden Genre-Ordner verschoben.
- Die temporäre Genre-Textdatei wird gelöscht.
Das Script sieht so aus:
$rootFolder = "F:\Musik\00-TEST"
$genreFolder = "F:\Musik\00-TEST\00-Genres"
$mp3tagPath = "C:\Users\matth\Documents\Mp3tag\Mp3tag.exe"
Get-ChildItem -Path $rootFolder -Directory | ForEach-Object {
$albumFolder = $_.FullName
# Mp3tag ausführen, um das Genre zu ermitteln
& $mp3tagPath $albumFolder
# Genre aus der Textdatei lesen
$genreFile = Join-Path $albumFolder "genre.txt"
if (Test-Path $genreFile) {
$genre = Get-Content $genreFile -Raw
$genre = $genre.Trim()
# Zielordner erstellen, falls nicht vorhanden
$targetFolder = Join-Path $genreFolder $genre
if (-not (Test-Path $targetFolder)) {
New-Item -Path $targetFolder -ItemType Directory
}
# Album-Ordner verschieben
Move-Item -Path $albumFolder -Destination $targetFolder -Force
# Aufräumen
Remove-Item $genreFile
}
}
Bin für jeden Hinweis dankbar.
Besten Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 668284
Url: https://administrator.de/contentid/668284
Ausgedruckt am: 03.12.2024 um 17:12 Uhr
18 Kommentare
Neuester Kommentar
Moin,
welches Programm wird denn da benutzt, welches MP3TAG? Falls es dieses ist: das unterstützt überhaupt keinen Kommandozeilenmodus, da musst Du erst in der GUI alles einstellen und bestätigen.
Gruß
DivideByZero
welches Programm wird denn da benutzt, welches MP3TAG? Falls es dieses ist: das unterstützt überhaupt keinen Kommandozeilenmodus, da musst Du erst in der GUI alles einstellen und bestätigen.
Gruß
DivideByZero
@DivideByZero
Das stimmt nicht ganz. Laut Dokumentation gibt es den Parameter.
Ausschnitt aus der Dokumentation:
Ich bin allerdings was Powershell betrifft, nicht so fit, ich nutze eher REXX.
Gruss Penny.
welches Programm wird denn da benutzt, welches MP3TAG? Falls es dieses ist: das unterstützt überhaupt keinen Kommandozeilenmodus, da musst Du erst in der GUI alles einstellen und bestätigen.
Das stimmt nicht ganz. Laut Dokumentation gibt es den Parameter
/add
Ausschnitt aus der Dokumentation:
Command Line Interface
These parameters can be used when starting Mp3tag from the command line:
Start with directory
Mp3tag.exe /fp:"<full-qualified path to directory>"
Starts Mp3tag in the specified directory using the directory as working directory.
Start with file
Mp3tag.exe /fn:"<full-qualified file name>"
Starts Mp3tag with the specified file using the directory of the file as working directory.
Add directory or file
/add
Use this in combination with /fp or /fn to add files to the file list. Please note, that files are not automatically sorted when added to the file list.
Ich bin allerdings was Powershell betrifft, nicht so fit, ich nutze eher REXX.
Gruss Penny.
Wieso externe Tools verwenden wenn es auch mit Bordmitteln geht?! 😉
Ganz ohne KI shiet😋
# Quellordner
$sourceroot = "d:\Musik\Alben"
# Ordner nach Genre
$sortedroot = "d:\Musik\sortiert"
# shell object
$shell = New-Object -Com Shell.Application
# Ordner nach Genre der ersten MP3 Datei der Ordner gruppieren
$groupedalbums = Get-ChildItem -Path $sourceroot -Directory | group-object {Get-ChildItem $_.Fullname -File -Filter *.mp3 -Recurse | select -First 1 | %{$shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("System.Music.Genre")}} | ? Name -ne ''
# Genre Gruppen durchlaufen und in Ordner mit Genre-Name verschieben
foreach($genre in $groupedalbums){
# Zielpfad erstellen
$targetpath = join-path $sortedroot $genre.Name
# Ordner erstellen falls er noch nicht existiert
if(!(Test-Path -Path $targetpath -PathType Container)){new-item -type dir -path $targetpath | out-null}
# Ordner in Zielordner verschieben
$genre.Group | move-item -Destination $targetpath -verbose
}
Ganz ohne KI shiet😋
Zitat von @Penny.Cilin:
@DivideByZero
Das stimmt nicht ganz. Laut Dokumentation gibt es den Parameter.
Ausschnitt aus der Dokumentation:
@DivideByZero
welches Programm wird denn da benutzt, welches MP3TAG? Falls es dieses ist: das unterstützt überhaupt keinen Kommandozeilenmodus, da musst Du erst in der GUI alles einstellen und bestätigen.
Das stimmt nicht ganz. Laut Dokumentation gibt es den Parameter
/add
Ausschnitt aus der Dokumentation:
Schon klar, ruft aber nur die GUI auf, daher ist die Alternative die reine powershell Lösung
Moin,
falls der Wechsel des Tools zum Auslesen der Tags eine Option für Dich ist, kann ich TagLibSharp empfehlen; der assembly ist leicht bei NuGet zu finden und in der Powershell ebenso einfach referenziert…
Viel Erfolg!
falls der Wechsel des Tools zum Auslesen der Tags eine Option für Dich ist, kann ich TagLibSharp empfehlen; der assembly ist leicht bei NuGet zu finden und in der Powershell ebenso einfach referenziert…
Viel Erfolg!
Moin Digitalfreunde,
ich habe ein recht ähnliches Vorhaben und bin froh, dass es hier bereits einen Code gibt, der im Wesentlichen das tun soll, was ich auch möchte. Daher habe ich in Testordnern MP3-Dateine zusammengesammelt um das mal auszuprobieren.
Leider scheitert es bei mir an dem Begriff "group-item“:
Ich bin da jetzt etwas Ratlos. Aber ggf. kann mir einer der Experten hier einen Tip geben?
Danke
Kreuzberger
ich habe ein recht ähnliches Vorhaben und bin froh, dass es hier bereits einen Code gibt, der im Wesentlichen das tun soll, was ich auch möchte. Daher habe ich in Testordnern MP3-Dateine zusammengesammelt um das mal auszuprobieren.
Leider scheitert es bei mir an dem Begriff "group-item“:
group-item : Die Benennung "group-item" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder
eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist
(sofern enthalten), und wiederholen Sie den Vorgang.
In Zeile:8 Zeichen:63
+ ... ums = Get-ChildItem -Path $sourceroot -Directory | group-item {Get-Ch ...
+ ~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (group-item:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Ich bin da jetzt etwas Ratlos. Aber ggf. kann mir einer der Experten hier einen Tip geben?
Danke
Kreuzberger
Moin.
Group-Item gibt's nicht nur Group-Object, weiß ehrlich gesagt nicht wo du das "Group-Item" her hast ? 🤔
Gruß catrell
Group-Item gibt's nicht nur Group-Object, weiß ehrlich gesagt nicht wo du das "Group-Item" her hast ? 🤔
Gruß catrell
Hallo @150940
danke für deine Interesse.
Ich habe den obigen Quellcode von @150704 so kopiert wie er da ist. Ich habe nur die Ordnerpfade geändert. Anschliessend habe ich ein paar Alben in das Quellverzeichnis kopiert und das Script gestartet. Da stiess er dann auf die von mir einkopierte Fehlermeldung bzgl. „group-item“ (nicht "Group-Object“).
Kreuzberger
danke für deine Interesse.
Ich habe den obigen Quellcode von @150704 so kopiert wie er da ist. Ich habe nur die Ordnerpfade geändert. Anschliessend habe ich ein paar Alben in das Quellverzeichnis kopiert und das Script gestartet. Da stiess er dann auf die von mir einkopierte Fehlermeldung bzgl. „group-item“ (nicht "Group-Object“).
Kreuzberger
Zitat von @kreuzberger:
Ich habe den obigen Quellcode von @150704 so kopiert wie er da ist. Ich habe nur die Ordnerpfade geändert.
Komisch das dieser Name darin gar nicht vorkommt, da steht Group-Object an der Stelle an der die Fehlermeldung Group-Item ausweist und hier funktioniert der o. Code im Test 🙃. Ergo CMDLet richtig schreiben dann klappt's .Ich habe den obigen Quellcode von @150704 so kopiert wie er da ist. Ich habe nur die Ordnerpfade geändert.
Korrektur:
Beim Vollständigen Kopieren des Codes von @150704 über die Zwischenablage ist „group-item“ durch "Group-Object“ ersetzt worden in Zeile 8. Ich bin erstaunt.
Das habe ich in meinem Script korrigiert.
Dennoch aber habe ich eine Fehlermeldung, und auch diese ist mir nicht einleuchtend:
Tja ....
Kreuzberger
Beim Vollständigen Kopieren des Codes von @150704 über die Zwischenablage ist „group-item“ durch "Group-Object“ ersetzt worden in Zeile 8. Ich bin erstaunt.
Das habe ich in meinem Script korrigiert.
Dennoch aber habe ich eine Fehlermeldung, und auch diese ist mir nicht einleuchtend:
group-object : Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
In Zeile:8 Zeichen:63
+ ... Directory | group-object {Get-ChildItem $_.Fullname -File -Filter *.m ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Group-Object], NullReferenceException
+ FullyQualifiedErrorId : System.NullReferenceException,Microsoft.PowerShell.Commands.GroupObjectCommand
Tja ....
Kreuzberger
Dann hast du wohl keine Unter-Ordner in dem Verzeichnis, das Ding sortiert ja Ordner anhand deren erster MP3 Datei ein keine MP3 Dateien separat . Klappt hier wie gesagt im Test einwandfreie, ansonsten passieren bei dir merkwürdige Dinge wenn sich da Dinge von selbst ändern. Mal nen Malware scan machen.
@150940
Doch doch. ich hab in mein Quellverzeichnis $sourceroot = "d:\Musik\Alben“ Ordnerweise Alben mit MP3-Dateien gefüllt. Je Album ein Ordner, in dem sich dann die MP3-Dateien Befinden.
In den Unterordnern befanden sich weitere Unterordner (leer, namens „CD1“), die ich nun gelöscht habe.
Fehlermeldung bleibt.
Es gibt einige Alben in FLC, die sollte aber bei dem angewendeten Filter „.mp3“ nicht stören.
Kreuzberger
Doch doch. ich hab in mein Quellverzeichnis $sourceroot = "d:\Musik\Alben“ Ordnerweise Alben mit MP3-Dateien gefüllt. Je Album ein Ordner, in dem sich dann die MP3-Dateien Befinden.
In den Unterordnern befanden sich weitere Unterordner (leer, namens „CD1“), die ich nun gelöscht habe.
Fehlermeldung bleibt.
Es gibt einige Alben in FLC, die sollte aber bei dem angewendeten Filter „.mp3“ nicht stören.
Kreuzberger
Dann haben wohl manche files kein Genre im Tag.
Zitat von @kreuzberger:
So, ich habe die FLAC-Dateien (Ordner) herausgenommen, nun hat das funktioniert.
Alle MP3-Dateien enthalten nachkontrolliert Genre-TAGS.
Sollte nicht der „.mp3“-Filter das überspringen????
Doch das tut er mit dem Filter korrekt, aber wahrscheinlich sind da mp3 Files dabei bei der denen der MS Filter die Tags nicht extrahieren/interpretieren kann und dann leer sind, kann man aber ausfiltern indem du die Zeile so schreibstSo, ich habe die FLAC-Dateien (Ordner) herausgenommen, nun hat das funktioniert.
Alle MP3-Dateien enthalten nachkontrolliert Genre-TAGS.
Sollte nicht der „.mp3“-Filter das überspringen????
$groupedalbums = Get-ChildItem -Path $sourceroot -Directory | group-object {Get-ChildItem $_.Fullname -File -Filter *.mp3 -Recurse | select -First 1 | %{$res = $shell.NameSpace($_.DirectoryName).ParseName($_.Name).ExtendedProperty("System.Music.Genre"); if ($res){$res}else{''}}} | ? Name -ne ''
Kann ich nicht bestätigen, hier ist es egal was für zusätzliche Files drin liegen wird eh nur nach *.MP3 Endungen gefiltert ... Bei dir passieren echt merkwürdige Dinge😀. Me out.