.bat oder .vbs Ordnername hinzufügen

Viper73

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
501
Hallo zuammen,

ich suche eine Möglichkeit ein ganzes Verzeichnis mit einem Klick umzubenennen (Win10).
Ich möchte einfach das vor dem bisherigen Dateinamen das Verzeichnis mit im Dateinamen angegeben wird.

Beispiel:
\Urlaub 2022\01.jpg -> \Urlaub 2022\Urlaub 2022 - 01.jpg

Ich möchte dazu eine Dabei (.bat oder .vbs) die ich einfach doppelklicken kann, dann werden alle Dateien in dem Ordner, in dem sich diese Datei befindet, umbenannt - also der Ordnername zum Dateinamen hinzugefügt.

Ich habe mal etwas gegoogelt, aber das konnte ich leider nirgendwo finden.

Für die mit Programmierspachen-Kenntnissen eine Kleinigkeit denke ich mal.
Wäre super wenn mir hier jemand weiterhelfen könnte.

Gruß,
Viper73
 
Mit einen Pythonskript sicher schnell gemacht, aber in dem Fall würde ich vorschlagen, sich mal PowerRename von den Microsoft Powertoys anzuschauen: https://docs.microsoft.com/de-de/windows/powertoys/

Das hat dann eine GUI und ist flexibler anzupassen, wenn man das Skript nicht versteht.
Ergänzung ()

Zugegeben, man muss sich mit Regulären Ausdrücken auskennen. Was es auch nicht unbedingt einfacher macht. Und ich bin mir nicht 100% sicher, ob man den Ordernamen mit verwenden kann.

Wenn man jeden Ordernamen einzeln eingibt, kann man die Einstellungen aus dem Anhang verwenden.

Vielleicht hat jemand anders noch eine andere Idee.
 

Anhänge

  • rename.png
    rename.png
    50,9 KB · Aufrufe: 195
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Mulciber
Mit VB Script geht das ganz gut. Findest dazu viel online.

Hier steht schonmal wie das mit dem umbenennen geht. Das ist ein Anfang.

Dann solltest du noch googlen wie du eine Schleife darum machst um mehrere Datei Namen zu ändern, dann solltest du nachlesen wie es funktioniert Datei und Ordnernamen auszulesen. Stück für Stück kommst du deiner Sache so näher und lernst noch was dabei.

Wenn du es einfacher haben möchtest, gibt es für so as aber auch Tools.
Z.b. das unter mir genannte.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Mulciber
Zuletzt bearbeitet:
Ansonsten hat der Faststone Imageviewer auch eine Stapelumbenennungsfunktion.
https://www.faststone.org/ (Ist sowieso ein sehr guter Bildbetrachter).
Umbenennen in "$P - *" würde hier das gewünschte Ergebnis bringen.
Hat den Vorteil, man kann auch Stapelkonvertieren, wenn man jemanden z.B. per Mail Urlaubsbilder zuschicken will die nicht so groß sein sollen.

Und ja, bei solchen Experimenten sollte man vorher den Ordner sichern.
 

Anhänge

  • faststone-rename.png
    faststone-rename.png
    163,8 KB · Aufrufe: 161
  • Gefällt mir
Reaktionen: PHuV
In Powershell ist das ein Einzeiler:
PowerShell:
Get-ChildItem -Exclude  $MyInvocation.MyCommand.Name | % { Move-Item $_.Fullname ($_.Directory.Name + ' - ' + $_.Name)  }

PS: Einfach in einer .ps1 Datei speichern. Ins gewünschte Verzeichnis kopieren und ausführen.
 
  • Gefällt mir
Reaktionen: Viper73
Man sollte hier auch unbedingt beachten, daß Windows bis heute mit Dateiname und Dateipfad ein Limit von maximal 255 Zeichen hat. Man kann dies aber durch einen Registry Eintrag erweitern.
Ergänzung ()

Korben2206 schrieb:
In Powershell ist das ein Einzeiler:
PowerShell:
Get-ChildItem -Exclude  $MyInvocation.MyCommand.Name | % { Move-Item $_.Fullname ($_.Directory.Name + ' - ' + $_.Name)  }
Ja, würde ich aber so nicht durchführen. Immer ordentlich ein Protokoll rausgeben, und eine Möglichkeit einbauen, es rückgängig zu machen, z.B. durch eine Sicherung des original Dateinames oder man arbeitet nicht mit Move-Item, sondern Copy-Item und erzeugt neue Dateien. Gibts eigentlich bei Copy-Item ein Flag für das Beibehalten für das ursprüngliche Datum, ich hab das auf die Schnelle nicht gesehen.
 
PHuV schrieb:
Ja, würde ich aber so nicht durchführen. Immer ordentlich ein Protokoll rausgeben, und eine Möglichkeit einbauen, es rückgängig zu machen.
Was soll man da loggen? Fehler werden ausgegeben, in diesem Fall ist das genug.

Rückgängig? ok...:
PowerShell:
Get-ChildItem -Exclude  $MyInvocation.MyCommand.Name | % { Move-Item $_.Fullname ($_.Name.Replace(($_.Directory.Name + ' - '),''))  }

Wenn man es "sicherer" haben will nutzt man entweder eines der oben genannten Tools oder man muss sich etwas intensiver mit Powershell beschäftigen.
Mir ging es mehr darum den TE auf eine modernere Lösung als Batch und VBScript hinzuweisen.
 
  • Gefällt mir
Reaktionen: PHuV
Korben2206 schrieb:
Was soll man da loggen? Fehler werden ausgegeben, in diesem Fall ist das genug.
Nope, weil man vielleicht doch irgendwie noch nachvollziehen wo und wie welche Datei umbenannt wurde? ☺️
 
PHuV schrieb:
Man sollte hier auch unbedingt beachten, daß Windows bis heute mit Dateiname und Dateipfad ein Limit von maximal 255 Zeichen hat. Man kann dies aber durch einen Registry Eintrag erweitern.
Sind 260 Zeichen.
Und die Registry-Einstellung bewirkt auch nur dann was, wenn die Anwendung damit umzugehen weiß. Quelle: https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd

Was das mit dem Thema genau zu tun hat, weiß ich allerdings auch nicht.
 
tollertyp schrieb:
Was das mit dem Thema genau zu tun hat, weiß ich allerdings auch nicht.
Nun, durch das Umbenennen wird der Dateipfad länger.
Sofern der Pfad aber nicht zigfach geschachtelt ist (mit teils langen Ordnernamen) sollte man das Limit jedoch nicht so schnell erreichen, es kann aber dennoch passieren.
 
Also das Limit gilt für die Win32-API. Man kann problemlos viel längere Ordnerstruktuen erstellen.

Die Windows PowerShell macht bei mir bei den langen Namen Probleme, die PowerShell 7 nicht.
1652006271655.png

Der Ordnerpfad hat >700 Zeichen. LongPathsEnabled=0 bei mir.

Ich möchte in Zukunft bei jedem Thread, wo eine Datei umbenannt wird oder ein neuer Ordner erzeugt wird bitte Hinweise auf die Begrenzung der Pfadlängen.

Und ja, ich kann die Datei nicht mehr dirket mit IrfanView öffnen und auch nicht mit den meisten anderen Programmen.
 
Zuletzt bearbeitet:
tollertyp schrieb:
Was das mit dem Thema genau zu tun hat, weiß ich allerdings auch nicht.
Wenn Du verschachtelte Verzeichnisse hast, und dann die Dateien nach dem Verzeichnis benennst willst, kanns eben ein Problem geben. Ist mir ja schon oft genug so passiert beim Umbenennen, ich sag nur mal MP3. Da wir ja nicht wissen, wo seine Daten lagern, daher lieber mal vorher ansprechen.

Tooles Tool zum Prüfen:
https://github.com/deadlydog/PathLengthChecker

Und ja, auf meinen beiden NAS und Sicherungen haben ich Ruckzuck mal 300-400 Zeichen.

Ergänzung ()

tollertyp schrieb:
Ich möchte in Zukunft bei jedem Thread, wo eine Datei umbenannt wird oder ein neuer Ordner erzeugt wird bitte Hinweise auf die Begrenzung der Pfadlängen.

Und ja, ich kann die Datei nicht mehr dirket mit IrfanView öffnen und auch nicht mit den meisten anderen Programmen.
Warum so sarkastisch? Wie Du ja selbst sehen kannst, das Problem ist real und kann bei unbedachten Umbenennungen zu Problemen führen.
Ergänzung ()

tollertyp schrieb:
Sind 260 Zeichen.
255+Delimiter, teste es aus.
https://docs.microsoft.com/de-de/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd

Viele Programme mit Dateifunktionen machen ab 255 dicht. Hängt wohl von den jeweilig verwendeten API ab. Ich habs mal in einer ruhigen Minute auf Arbeit mit diversen Programmen getestet.

Ausführlich hatten wir das Thema hier schon besprochen, wo ich auch diverse Tests gemacht hatte:
https://www.computerbase.de/forum/t...fe-packen-und-unter-kontrolle-halten.2039852/
 
Zuletzt bearbeitet:
Also erstmal vielen Dank an alle für die Hilfe/Tipps.

Ich verwende für meine Massen-Dateiänderungen immer "Advanced Renamer" und bin damit sehr zufrieden. Dies hier ist nur ein Spezialfall wenn es mal schnell gehen soll da ich das oft brauche, daher will ich hier wirklich nur eine .bat / .vbs / .ps1 Datei zum schnell mal ausführen. Eine vbs/bat wäre mir am liebsten gewesen da ich mit powershell noch nie was gemacht hab, aber ich hab mal rumprobiert und finde diesen Code von @Korben2206 gut, genau was ich gesucht hatte.

Korben2206 schrieb:
In Powershell ist das ein Einzeiler:
PowerShell:
Get-ChildItem -Exclude  $MyInvocation.MyCommand.Name | % { Move-Item $_.Fullname ($_.Directory.Name + ' - ' + $_.Name)  }

PS: Einfach in einer .ps1 Datei speichern. Ins gewünschte Verzeichnis kopieren und ausführen.

Vielleicht schaue ich mir mal Powershell ein bisschen genauer an und bastle noch eine Abfrage rein "Ausführen ja/nein" oder sowas.

Danke an alle, Gruß,
Viper73
 
Viper73 schrieb:
Abfrage rein "Ausführen ja/nein" oder sowas.
Hier mal ein Denkanstoß, wie das aussehen könnte:

PowerShell:
$TEST = [System.Windows.Forms.MessageBox]::Show("Ich habe da mal eine Frage.`n`nNeugierig?","Frage ...","YESNO","Question")
If ($TEST -Eq "NO")
{
    Write-Host "Dann eben nicht!" -ForegroundColor red
}
ElseIf ($TEST -Eq "YES")
{
    Write-Host "So ist es brav." -ForegroundColor green
}
 
  • Gefällt mir
Reaktionen: Viper73 und PHuV
@NotNerdNotDau

Gerade mal eine Frage zu deinem Code:
Wenn ich es in "PowerShell ISE" öffne/starte das klappt es...

Wenn ich es aber mit rechtsklick "mit Powershell ausführen" starte, dann kommt kurz ein blaues Fenster (PowerShell) und schließt sich gleich wieder. Die Abfrage kommt aber nicht. Was muß ich machen das es auch mit rechtsklick und "mit Powershell ausführen" funktioniert?
 
Ich hab es gerade mal ausprobiert.
Wenn man an den Anfang des Skripts noch die Zeile
Code:
Add-Type -AssemblyName System.Windows.Forms
hinzufügt, dann funktioniert es.
Ohne kommt die Fehlermeldung Unable to find type [System.Windows.Forms.MessageBox]. welche das Fenster sofort wieder schließen lässt.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: NotNerdNotDau
Ah cool, danke. Die Fehlermeldung wollte ich gerade googeln als ich die entdeckt habe ;-)

Habe jetzt noch das hinten angehängt:
Read-Host -Prompt "Bitte eine beliebige Taste zum Beenden drücken ..."
oder vielleicht nehm ich auch:

Damit ich sehe was als Ausgabe kommt, da das Fenster sich ja sonst automatisch wieder schließt.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: NotNerdNotDau
Zurück
Oben