Powershell - MP3s umbenennen
Hallo,
ich bin komplett neu in die Powershell-Umgebung eingetaucht. Mein Ziel ist es meine MP3s (max. 30 Titel je Ordner) umzubenennen, sodass die Titelnummer am Anfang des Namens steht.
Dazu habe ich auch schon die folgende Funktion im Internet gefunden und Code darunter selbst zusammengebaut. Soweit funktioniert es auch. Das einzige Problem ist, dass er einige Dateien doppelt umbenennt und ich weiß nicht warum. Soll heißen statt "02 - Musik.mp3" steht am Ende "02 - 02 - Musik.mp3" da.
Kann mir hier jemand helfen?
ich bin komplett neu in die Powershell-Umgebung eingetaucht. Mein Ziel ist es meine MP3s (max. 30 Titel je Ordner) umzubenennen, sodass die Titelnummer am Anfang des Namens steht.
Dazu habe ich auch schon die folgende Funktion im Internet gefunden und Code darunter selbst zusammengebaut. Soweit funktioniert es auch. Das einzige Problem ist, dass er einige Dateien doppelt umbenennt und ich weiß nicht warum. Soll heißen statt "02 - Musik.mp3" steht am Ende "02 - 02 - Musik.mp3" da.
Kann mir hier jemand helfen?
function Add-ExtendedFileProperties{
<#
.SYNOPSIS
Fügt erweiterte Eigenschaften von Dateien an das Objekt in der Pipline hinzu
.DESCRIPTION
Extrahiert erweiterte Eigenschaften von Dateien wie z.B. Exif-Daten, Musik- bzw. Filmdetails
.EXAMPLE
Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties -PropertyExtended "Bildhöhe","Bildbreite","Datenrate" | ft Name,Bildhöhe,Bildbreite,Datenrate
Fügt alle nur die Eigenschaften "Bildhöhe","Bildbreite","Datenrate" als zusätzliche Spalten dem Objekt in der Pipline hinzu
.EXAMPLE
Get-ChildItem "C:\Temp" | Add-ExtendedFileProperties | fl *
Fügt alle verfügbaren erweiterten Eigenschaften dem Objekt in der Pipline hinzu
.PARAMETER PropertyExtended
Mit diesem Parameter geben sie eine Komma-Separierte Liste von Eigenschaften an welche sie erhalten möchten.
-PropertyExtended "Bildhöhe","Bildbreite","Bitrate"
#>
param(
[Parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)]
$fileItem,
[String[]] $PropertyExtended = "ALL"
)
begin
{
$shellObject = New-Object -Com Shell.Application
$itemProperties = $null
}
process
{
if($fileItem.PsIsContainer)
{
$fileItem
return
}
$directoryName = $fileItem.DirectoryName
$filename = $fileItem.Name
$folderObject = $shellObject.NameSpace($directoryName)
$item = $folderObject.ParseName($filename)
if(-not $itemProperties)
{
$itemProperties = @{}
$counter = 0
$columnName = ""
if ($PropertyExtended -eq "ALL"){
#get all properties
do {
$columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
if($columnName) { $itemProperties[$counter] = $columnName }
$counter++
}while($columnName)
}else{
#get user defined properties
do {
$columnName = $folderObject.GetDetailsOf($folderObject.Items, $counter)
foreach($name in $PropertyExtended){
if ($columnName.toLower() -eq $name.toLower()){
$itemProperties[$counter] = $columnName
}
}
$counter++
}while($columnName)
}
}
foreach($itemProperty in $itemProperties.Keys)
{
$fileItem | Add-Member NoteProperty $itemProperties[$itemProperty] `
$folderObject.GetDetailsOf($item, $itemProperty) -ErrorAction `
SilentlyContinue
}
$fileItem
}
}
$input = Read-Host "Gib den Pfad ein."
$pfad = $input
$anzahl = Get-ChildItem $pfad -File | Measure-Object | %{$_.Count} #anzahl der Dateien im Ordner bestimmen
$msg = $anzahl
[System.Windows.Forms.MessageBox]::Show($msg,"Titel",0)
Get-ChildItem $pfad | ForEach-Object{
$start = $_ | Add-ExtendedFileProperties <#-PropertyE1xtended "Titelnummer"#> | select Titelnummer
$ende = $_ | Add-ExtendedFileProperties <#-PropertyE1xtended "Name"#> | select Name
[String]$titel1 = $start
[String]$titel2 = $ende
if($titel1.length -ge 17){ #Länge der Ausgabe bei zwei ziffern = 17
$laenge = $titel1.length
$start = $titel1.substring($laenge - 3)
$nummer = $start.Substring(0,2)
} #if
else {#Länge der Ausgabe bei einer ziffer = 16
$laenge = $titel1.length
$start = $titel1.substring($laenge - 2) # @Titelnummer:{ entfernen
$nummer = $start.Substring(0,1) # } entfernen
$nummer = "0"+$nummer
}#Esle
$laenge = $titel2.Length
$titel2 = $titel2.Substring($laenge - ($laenge - 7)) # @Name:{ entfernen
$laenge = $titel2.Length
$name = $titel2.Substring(0,$laenge - 1) # } entfernen
$vollername = $nummer+" - "+$name #Zahl und Name zusammenführen
<#$msg = $vollername
[System.Windows.Forms.MessageBox]::Show($msg,"Titel",0)#>
Rename-Item -Path $pfad\$name -NewName $vollername
} #foreach
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 566162
Url: https://administrator.de/contentid/566162
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
15 Kommentare
Neuester Kommentar
Du lässt dir mitten in deinem Code den Inhalt der Variablen anzeigen. Dann siehst du in welchen Variablen das drinnen steht, was drinnen stehen soll und wo nicht.
Du hast z.B. folgenden Code:
Jetzt lässt du dir den Inhalt von $nummer anzeigen und den Inhalt von $name. Dann siehst du ob in der Variable $nummer eine "02 -" zu viel drinnen steht, oder das "02 -" sogar bereits unter $name drinnen steht, obwohl es da gar nicht mehr sein müsste. So kannst du verfolgen wo der überflüssige String her kommt.
Du hast z.B. folgenden Code:
$vollername = $nummer+" - "+$name
Was ist bei "04 04 - Das ..." im $nummer drinnen und was im $name?
Ich vermute, dass in $nummer ein "04 04" drinnen steht und $name in Ordnung ist.
Das kannst du aber nur richtig überprüfen, wenn du bei der Ausgabe ein Trennzeichen oder Erkennungszeichen dazu baust.
Wenn es bestätigt ist, dann musst du weiter oben alle Variablen loggen warum sich $nummer doppelt füllt.
Ich vermute, dass in $nummer ein "04 04" drinnen steht und $name in Ordnung ist.
Das kannst du aber nur richtig überprüfen, wenn du bei der Ausgabe ein Trennzeichen oder Erkennungszeichen dazu baust.
Wenn es bestätigt ist, dann musst du weiter oben alle Variablen loggen warum sich $nummer doppelt füllt.
Ich kann dir leider bei dem Powershell Problem nicht helfen. Aber um dein Ziel zu erreichen kann ich dir nur dieses Free Tool empfehlen.
https://www.1-4a.com/rename/
Für Hilfe in Powershell, musst du leider auf andere Hilfe hoffen.
https://www.1-4a.com/rename/
Für Hilfe in Powershell, musst du leider auf andere Hilfe hoffen.
Moin,
versuche mal statt
das hier:
Ich vermute mal, dass Folgendes passiert:
Get-ChildItem liest das Verzeichnis aus und übergibt sofort die ersten Ergebnisse an die Pipe bevor der Befehl vollständig abgearbeitet ist. Nun werden die ersten Dateien umbenannt. Am Ende findet Get-ChildItem die umbenannten Dateien, übergibt sie nochmal an die Pipe und es kommt zu dem falschen Ergebnis.
hth
Erik
versuche mal statt
Get-ChildItem $pfad | ForEach-Object{
das hier:
$files = Get-ChildItem $pfad
ForEach($file in $files) {
# im Folgenden $_ mit $file ersetzen
}
Ich vermute mal, dass Folgendes passiert:
Get-ChildItem liest das Verzeichnis aus und übergibt sofort die ersten Ergebnisse an die Pipe bevor der Befehl vollständig abgearbeitet ist. Nun werden die ersten Dateien umbenannt. Am Ende findet Get-ChildItem die umbenannten Dateien, übergibt sie nochmal an die Pipe und es kommt zu dem falschen Ergebnis.
hth
Erik
Moin,
Doch, die ist definiert. Die erzeuge ich mit
Jetzt steht "irgendwas" in der Variablen. Sie ist eine Stringvariable.
$files = get-childitem
Jetzt stehen die Objekte, die get-childitem zurückgibt, in der Variablen. Sie ist ein Array von Objekten.
Meistens erkennt die PS den richtigen Typ der Variablen von alleine. Manchmal muss man ihn aber explizit angeben. Zum Beispiel, wenn man eine XML-Datei in ein Objekt einlesen möchte.
schreibt zwar den Inhalt der Datei in die Variable aber eben nicht als XML-Objekt, sondern als String.
schreibt den Inhalt als XML-Objekt in die Variable.
Letztlich kannst du Variablen benennen, wie Du lustig bist, sofern Du die Regeln einhälst, die für die jeweilige Sprache gelten. Allgemein sollte man sich auf Buchstaben des lateinischen Alphabets, Ziffern und Unterstrich beschränken. Das geht immer. Man sollte sich eine Nomenklatur überlegen und sich dran halten. Vor allem dann, wenn man mit anderen zusammenarbeitet.
hth
Erik
Zitat von @ChakkaCor:
das $files ist ja nirgends definiert. Ist das eine Variable die Powershell generell definiert hat oder könnte ich sie auch anders benennen?
das $files ist ja nirgends definiert. Ist das eine Variable die Powershell generell definiert hat oder könnte ich sie auch anders benennen?
Doch, die ist definiert. Die erzeuge ich mit
$files = "irgendwas"
Jetzt steht "irgendwas" in der Variablen. Sie ist eine Stringvariable.
$files = get-childitem
Jetzt stehen die Objekte, die get-childitem zurückgibt, in der Variablen. Sie ist ein Array von Objekten.
Meistens erkennt die PS den richtigen Typ der Variablen von alleine. Manchmal muss man ihn aber explizit angeben. Zum Beispiel, wenn man eine XML-Datei in ein Objekt einlesen möchte.
$notxml = get-content file.xml
schreibt zwar den Inhalt der Datei in die Variable aber eben nicht als XML-Objekt, sondern als String.
[xml]$xml = get-content file.xml
schreibt den Inhalt als XML-Objekt in die Variable.
Letztlich kannst du Variablen benennen, wie Du lustig bist, sofern Du die Regeln einhälst, die für die jeweilige Sprache gelten. Allgemein sollte man sich auf Buchstaben des lateinischen Alphabets, Ziffern und Unterstrich beschränken. Das geht immer. Man sollte sich eine Nomenklatur überlegen und sich dran halten. Vor allem dann, wenn man mit anderen zusammenarbeitet.
hth
Erik