PowerShell umbennen von Ordner mit Dateien

Don-DCH

Captain
Registriert
Aug. 2009
Beiträge
3.235
Guten Nachmittag zusammen,

ich versuche schon eine Weile mit PowerShell und Get-Child-Item, sowie Rename-ITem mein Problem zu lösen, leider klappt es nicht so recht.

Aussgangssituation: Ich habe unter D:\Platzhalter
immer einen Ordner, dieser hat das heutige Datum, Uhrzeit und Platzhalter im Namen. Darunter sind Dateien, die ebenfalls immer Platzhalter mit verschiedenen Endungen heißen.

Nun möchte ich, dass sobald ich das Skript ausführe der Unterordner unter D:\Platzhalter umbenannt wird sowie auch alle Dateien in diesem Ordner, ohne das die Dateiendung verloren geht.

Wie löse ich das am besten? Ich hatte eine Foreach Schleife versucht, aber das hatte nicht so geklappt.

Über Tipps wäre ich dankbar.

Viele Grüße und einen schönen Sonntag :)
 
Nicht sicher, exakt was Du wie umbenennen möchtest. :confused_alt:

Wichtig ist zu beachten, daß PS sich etwas eigen hat in Bezug auf Datei/Ordnerreferenzen, wenn man diese zur Laufzeit ändert (Rename, Move, Remove, etc). Dann gehen die Referenzen meist verloren und man muß buchstäblich den Rückgabewert der Funktion / des cmdlets weiterverwenden, welcher manchmal "einfach so" und manchmal erst auf Anforderung (-Passthru) zurückkommt.

PS hilft aber ein bißchen bei den Eigenschaften eines Datei/Ordnerobjekts.
Da gibt es Name (Datei.erweiterung) Basename(Datei) und Extension (.erweiterung), die man pauschal zur Verfügung bekommt. Aufpassen, .Extension hat den Punkt mit dabei.

Fürs Bestimmen des neuen Namen gibt es $string -replace <regex>,<string> und $string.Replace($alterWert, $neuerWert).
Ersteres erwartet einen regulären Ausdruck. Zweiteres einen einfachen String. Unbedingt aufpassen, welches man nimmt, je nachdem, was man wie ersetzen will:

PowerShell:
'datei.mp3' -replace '.', 'A'
AAAAAAAAA

'datei.mp3'.replace('.','A')
dateiAmp3
 
Ich glaube es wäre einfacher dir zu helfen wenn du dein Skript posten würdest. Dann würde etwas klarer was du vorhast.
Ich kann nur sagen, das ich schon öfters mit foreach und move-item (rename-item geht vermutlich auch) schon ganze Ordnerbäume erfolgreich umbenannt habe.
 
Sicher dass du Powershell verwenden willst anstatt anderere Software? BG
 
Vielen Dank euch für die zahlreichen und ausführlichen Antworten :)

Anbei nochmal ein Screenshot:
1651426460777.png


Diese Dateien bekomme ich von meiner Capture Software und über Touch Portal würde ich gerne ein PowerShell Skript schreiben, was mir die Dateien so benennt wie ich es gerne hätte, dadurch muss ich nicht jedes mal in der Software etwas anpassen und mir merken nach welchem Namenskonzept ich es benannt habe, zumal es in der Software auch probleme mit zu kurzen Namen etc. gibt.


Mein Skript würde ich posten aber so wirklich habe ich nicht was.
Ich hatte überlegt ob man alle Werte in ein Objekt einliest und es so einfacher wäre?

Das Skriüt müsste zuerst dann die Dateien Umbennen und dann den ordner, das es da nicht zu fehlerhaften pfaden führt wenn ich das richtig sehe.

@RalphS
Das mit dem ersetzen und Basename klingt gut, hätest du da ein Beispiel anhand meines Screenshots, das wäre toll :)

PowerSHell fände ich am besten für meinen Zweck, da ich die Skripte mit Software wie Touch Portal etc. auslösen könnte.

Vielen Dank euch schonmal und einen schönen Abend!
 
PowerShell:
$baseDir = 'D:\Platzhalter'

foreach ($sub in (Get-ChildItem $baseDir -Directory)) {             # Unterordner abarbeiten
    foreach ($file in ($sub | Get-ChildItem -File)) {  # Dateien in Unterordner abarbeiten
        $newFileName = $file.BaseName.Replace('Platzhalter','Ersetzen') + $file.Extension
        if ($newFilename -ne $file.Name) { Rename-Item $file.FullName $newFileName }
    }
    $newFolderName = $sub.Name.Replace('Platzhalter','Ersetzen')
    if ($newFolderName -ne $sub.Name) { Rename-Item $sub.FullName $newFolderName }
}
 
  • Gefällt mir
Reaktionen: Don-DCH und NotNerdNotDau
@Korben2206
Ich will jetzt nicht in deinem Code rumpfuschen, aber soll da nicht auch noch das aktuelle Datum und die Uhrzeit mit einbezogen werden?

Hier der Einzeiler, der in den Code mit eingebaut werden kann:

PowerShell:
$CurDate = (Get-Date).ToString("yyyy-MM-dd HH-mm-ss")
 
Korben2206 schrieb:
PowerShell:
$baseDir = 'D:\Platzhalter'

foreach ($sub in (Get-ChildItem $baseDir -Directory)) {             # Unterordner abarbeiten
    foreach ($file in ($sub | Get-ChildItem -File)) {  # Dateien in Unterordner abarbeiten
        $newFileName = $file.BaseName.Replace('Platzhalter','Ersetzen') + $file.Extension
        if ($newFilename -ne $file.Name) { Rename-Item $file.FullName $newFileName }
    }
    $newFolderName = $sub.Name.Replace('Platzhalter','Ersetzen')
    if ($newFolderName -ne $sub.Name) { Rename-Item $sub.FullName $newFolderName }
}
Vielen herzlichen Dank dir!
Das funktioniert sehr gut, leider habe ich ja zweimal den Namen Platzhalter drinne, schön wäre es, wenn einer davon weg käme, so das ich nur einmal den Namen habe geht das?
1651479213066.png

Nicht wundern wegen der Raute und der Zahl, habe noch ein bisschen was ergänzt im Skript :)
Hmm eine Idee, welche mir gerade kommt, wäre den String zu zerlegen und alles vor dem - inkluse - zu entfernen wenn das geht hmm.

Das Kirsche auf der Torte wäre noch, wenn man das Datum (beim Ordner) was vorne steht nach hinten verfrachtet, zuerst die Zeit und dann Tag,Monat Jahr :D

Vielen Dank euch :)

Anbei der aktuellste Code, welchen ich nutze:



cls
$Zahl =0


$baseDir = 'D:\Platzhalter'
$NeuerName = "Test123"


$TEST = Get-ChildItem -Path $baseDir -Filter "$NeuerName"
$Test2 = $Test.Name
$Zahl=$TEST2.split("#")[-1]

$Zahl=$Zahl -as [INT]

$Zahl++

#$zahl.GetType().Name

foreach ($sub in (Get-ChildItem $baseDir -Directory)) { # Unterordner abarbeiten
foreach ($file in ($sub | Get-ChildItem -File)) { # Dateien in Unterordner abarbeiten
$newFileName = $file.BaseName.Replace("Platzhalter","$NeuerName"+" #" + "$Zahl") + $file.Extension
if ($newFilename -ne $file.Name) { Rename-Item $file.FullName $newFileName }
}
$newFolderName = $sub.Name.Replace("Platzhalter","$NeuerName"+" #" + "$Zahl")
if ($newFolderName -ne $sub.Name) { Rename-Item $sub.FullName $newFolderName }
}

Ok, so shcön formatiert bekomme ich es leider nicht hin :(

Habe die Lösung für die Umbennenung bezüglich des Doppelnamens gefunden, anbei die aktualisierte Zeile:
$newFileName = $file.BaseName.Replace("Platzhalter - Platzhalter","$NeuerName"+" #" + "$Zahl") + $file.Extension
$newFolderName = $sub.Name.Replace("Platzhalter - Platzhalter","$NeuerName"+" #" + "$Zahl")

Jetzt fehlt nur noch das Datum sortieren, falls das geht hmm
 
Zuletzt bearbeitet:
Don-DCH schrieb:
Ok, so shcön formatiert bekomme ich es leider nicht hin
Du musst bei der Code-Auswahl in der Liste auf PowerShell klicken. Die Code-Auswahl erreicht man über das Symbol mit den drei senkrecht angeordneten Punkten.
 
Eigentlich ist es für die Sortieung doch besser wenn das Datum vorne steht und dann erst die Zeit.. sonst würfelst du Ordner die über mehrere Tage erstellt wurden durcheinander ...
 
Guten Nachmittag zusammen

@NotNerdNotDau
Danke dir, werde ich gleich mal testen :)
@Korben2206 Stimmt schon, jedoch hätte ich gerne erst den Titel.
Ich nummeriere auch fortlaufend durch, so dass das Datum eher zweitrangig und nice to have ist :)

So habe ich es gelöst, bestimmt geht es besser aber ich war froh, das es so klappt :)

PowerShell:
$ordner= Get-ChildItem -Path G:\Ungeschnitten\temp
foreach ($h in $Ordner.name)
{
$Jahr = $h[0]+$h[1]+$h[2]+$h[3]
$Monat = $h[5]+$h[6]
$Tag = $h[8]+$h[9]

$Stunde = $h[11]+$h[12]
$Minute = $h[14]+$h[15]
$Sekunde = $h[17]+$h[18]

$NeuesDatum = $Tag+"-"+$Monat+"-"+$Jahr+" "+$Stunde+"-"+$Minute+"-"+$Sekunde
$h.Split("-")
$hallo = $h.Split("-")
$hallo2 = $hallo[5].Trim()

Rename-Item -Path ("G:\Ungeschnitten\temp\"+$h )-NewName ("$hallo2" + " " + "$NeuesDatum")
}

Vielen Dank an dieser Stelle allen nochmal :) alles funktioniert genau so, wie ich es mir gewünscht hatte :)
 
Zurück
Oben