Batch Datei umbenennen, wenn sie einen bestimmten String enthält

harle

Cadet 3rd Year
Registriert
Aug. 2004
Beiträge
33
Hallo zusammen,

vorab, ich habe keine Ahnung von Batch Programmierung.

Ich habe mehrere Dateien in einem Verzeichnis; diese Dateien sind nach folgendem Muster benannt:

String (unterschiedlich pro Datei) & Versionsnummer (immer anders).

Ich würde gerne über eine Batch bestimmte Strings definieren, über die dann die Dateien identifiziert werden um in einen anderen Namen umbenannt.

Z. b. Dateiname enthält "Test" --> umbenennen in Test-Neu.
Die Versionsnummer spielt keine Rolle.

Ist so ein Vorhaben überhaupt über eine einfache Batch realisierbar?


Viele Grüße
 
Mit PowerShell sicher einfacher als mit Batch.
Eventuell helfen aber auch Renaming-Tools wie PowerRename.

Ach ja, wenn du experimentierst, bietet es sich an, ein paar (repräsentative) Dateien herauszukopieren und mit diesen zu üben (am besten auch von den Dateien dann immer noch ein Backup haben, damit man sie nicht wieder mühsam raussuchen muss). Erst wenn du sicher bist, dass alles passt, sie auf die realen Dateien loslassen - und am besten davon halt auch vorher ein Backup, man weiß ja nie.
 
  • Gefällt mir
Reaktionen: pizza4ever, Maviapril2, Raijin und 3 andere
harle schrieb:
Z. b. Dateiname enthält "Test" --> umbenennen in Test-Neu.
Die Versionsnummer spielt keine Rolle.

Ist so ein Vorhaben überhaupt über eine einfache Batch realisierbar?
Japp

tollertyp schrieb:
Mit PowerShell sicher einfacher als mit Batch.
Nein

Also jain... kommt drauf an. Für mich klingt das so, als wolle er einfach nur ein "-Neu" vor die Dateiendung schreiben.

Für folgendes Beispiel muss die Dateiendung bekannt sein:
Code:
REN *ABC*.TXT *-NEU.TXT

Das Beispiel würde nun jeder .TXT-Datei, die irgendwo im Dateinamen ein "ABC" enthält, einfach nur den Zusatz "-NEU" vor die Dateiendung anfügen.
 
Zuletzt bearbeitet:
Also wenn du aus diesen Aussagen solch spezifische Informationen schließen kannst, dann glückwunsch.
harle schrieb:
Ich würde gerne über eine Batch bestimmte Strings definieren, über die dann die Dateien identifiziert werden um in einen anderen Namen umbenannt.

Z. b. Dateiname enthält "Test" --> umbenennen in Test-Neu.
Die Versionsnummer spielt keine Rolle.

Vermutlich fehlt mir da Menschenkenntnis oder Intuition.

Bleiben wir beim Beispiel. Sagen wir mal, es geht um "Test". Die Datei heißt "Das ist ein Test oder so.txt". Wie soll die Datei am Ende heißen? Ich kann dir das nicht sagen, weil mir nicht klar ist, ob die gesamte Datei in "Test-Neu" oder "Test" in "Test-Neu" und damit die Datei in "Das ist ein Test-Neu oder so.txt" umbenannt werden soll.

Generell hört es sich für mich aber so an, als wären da gewisse Fälle zu unterscheiden. Das kann mit geschickten Wildcards durchaus möglich sein, das könnte man auch durch eine Vorsortierung erreichen, und und und... aber mir ist die Frage an der Stelle zu unspezifisch, als dass ich sagen könnte "Klar, mach das mit Batch, ist bestimmt super einfach". Ich habe eher ein anderes Gefühl da.

Ach ja, dein Code für das Umbenennen ist falsch, sorry, aber das funktioniert sicher nicht so, wie du es beschrieben hast...

DJMadMax schrieb:
REN ABC.TXT -NEU.TXT

Das Beispiel würde nun jeder .TXT-Datei, die irgendwo im Dateinamen ein "ABC" enthält, einfach nur den Zusatz "-NEU" vor die Dateiendung anfügen.
1657628295475.png


Aber immerhin schön veranschaulicht, warum man immer Backups vor dem Ausprobieren haben sollte.

Und so trivial ist das halt gar nicht:
1657628562525.png
 
Zuletzt bearbeitet:
In Powershell würde ich das auch besser kennen...

hier z.B. eine gute Grundlage beschrieben: https://stackoverflow.com/questions/22182409/replace-part-of-file-name-powershell

Die Beiträge erklären den nötigen Code auch gut, da ist eigentlich nichts hinzuzufügen...

PowerShell:
$Find = $args[0]
$Replace = $args[1]
$TargetFiles =  Get-ChildItem | Where-Object {$_.Name -like "*$Find*"}
ForEach($File in $TargetFiles)
{
    $newname = ([String]$File).Replace($Find,$Replace)
    write-host "Renaming $File to $newname"
    Rename-item -Path $File.PSPath $newname
}
 
  • Gefällt mir
Reaktionen: xexex, pizza4ever und tollertyp
tollertyp schrieb:
Ach ja, dein Code für das Umbenennen ist falsch, sorry, aber das funktioniert sicher nicht so, wie du es beschrieben hast...
Doch, der funktioniert, aber das Forum hat mir die Sternchen weggehauen ^^
So sollte es zuvor schon stehen:
Code:
REN *ABC*.TXT *-NEU.TXT
Ergänzung ()

@harle soll sich halt nochmal zu Worte melden. Wenn es einfach nur darum geht, bei Dateinamen mit bestimmten Strings eine "-NEU" Endung dazu zufügen (vor der Dateiendung), dann wäre der Code von @Rickmer sicherlich etwas übertrieben, wenn es auch mit ner Einzeiler-Batchdatei geht.
 
DJMadMax schrieb:
dann wäre der Code von @Rickmer sicherlich etwas übertrieben, wenn es auch mit ner Einzeiler-Batchdatei geht.
Ich habe mir absichtlich den Beispielcode vom Link rausgesucht, der am ausführlichsten sich selbst beschreibt ;)
Einzeiler geht auch mit Powershell, aber grade als Laie ist es dann (deutlich) schwieriger durchzublicken, was passiert.

Ich habe lieber ein paar mehr Zeilen Code der sich leicht lesen lässt, als eine Sammlung von Einzeilern die man erstmal dechiffrieren muss.
 
Hallo zusammen,

ich wollte nur noch etwas mehr Infos geben und werde dann zuhause alle Lösungsvorschläge testen.

Durch einen zu definierenden Suchstring möchte ich eine Datei identifizieren (z.B. Dateiname enthält "Test" oder "reverse" oder "xxx"). Diese Datei soll dann umbenannt werden in Wunschname (hier war es als Beispiel Test-Neu).

Also wenn Dateiname enthält String, dann rename Datei in Wunschname.
 
DJMadMax schrieb:
Doch, der funktioniert, aber das Forum hat mir die Sternchen weggehauen ^^
So sollte es zuvor schon stehen:
Code:
REN *ABC*.TXT *-NEU.TXT
Was ich durch meinen zweiten Screenshot doch schon lange widerlegt habe...
 
tollertyp schrieb:
Was ich durch meinen zweiten Screenshot doch schon lange widerlegt habe...
Komisch nur, dass es per Batch einwandfrei funktioniert - Windows 10 Server 21H2
 
Okay, Aussage gegen Screenshot, da glaube ich jetzt deiner Aussage.

Also bei mir sowohl unter Windows 10 und Windows 11 das gleiche Verhalten, anbei die Batch:
Code:
@echo off
echo > ABC.TXT
echo Directory Before:
dir /b
echo.
echo Renaming
ren *ABC*.TXT *-NEU.TXT
echo.
echo Directory After:
dir /b
pause

und der Screenshot
1657636708539.png


Aber vermutlich irre ich mich, das ist sicher das wahrscheinlcihere.
 
DJMadMax schrieb:
Doch, der funktioniert, aber das Forum hat mir die Sternchen weggehauen ^^
So sollte es zuvor schon stehen:
Code:
REN *ABC*.TXT *-NEU.TXT
Ergänzung ()

@harle soll sich halt nochmal zu Worte melden. Wenn es einfach nur darum geht, bei Dateinamen mit bestimmten Strings eine "-NEU" Endung dazu zufügen (vor der Dateiendung), dann wäre der Code von @Rickmer sicherlich etwas übertrieben, wenn es auch mit ner Einzeiler-Batchdatei geht.
Im Grunde möchte ich das. Allerdings möchte ich für sagen wir 3 verschiedene Quellen-Suchstrings 3 verschiedene, frei definierbare Zieldateinamen.

Also nicht "-NEU" anhängen sondern komplett anders nennen.

Es geht darum, dass in regelmäßigen Abständen neue Dateien bekomme, die grundsätzlich ähnlich heißen "app-test-123" "revision-123" "config-123" (bis auf die 123, welche variabel sind) und ich möchte diese Dateien Anhang des Strings "app", "revision" und "config" identifizieren und umbenennen in "app-tralala", "revision-soundso" und "config-achja".

Am liebsten natürlich mit einem Klick auf .bat oder .ps1. Hatte nur automatisch immer an .bat gedacht und grundsätzlich würde es mich interessieren, wie eine Lösung dort aussehen kann.

Ich werde mich im Laufe des Abends mit den vorgeschlagenen Wegen beschäftigen.
 
Also wenn immer wieder Dateien hinzukommen, ist ein Script natürlich sinnvoll.

Aber wie kann man sich das dann vorstellen?
Wenn also heute "config-123" drin ist und zu "config-achja" umbenannt wird, und dann kommt "config-246" dazu, zu was soll das umbenannt werden? Und ich nehme an "config-achja" soll nach wie vor "config-achja" heißen? Das sind alles Faktoren, die du anfangs hättest nennen sollen, weil der Wildcard ist es egal, ob da -246 oder -achja steht.
 
tollertyp schrieb:
Okay, Aussage gegen Screenshot, da glaube ich jetzt deiner Aussage.
Okay, abgefahren - ich teste es hier gerade zuhause am Windows 10 Pro und was soll ich sagen... ich kann dich voll und ganz verstehen, hier funktioniert es auch nicht. Auf der Arbeit am Terminalserver war das gar kein Problem.

Ich kann mich auch dunkel erinnern, dass es da irgend ein Problem mit dem Batch-Handling bei Windows gibt, ich meine, da in der Vergangenheit schon einmal drübergestolpert zu sein. Ich forsche mal und schau, was ich herausfinden kann.

Ansonsten verstehe ich aber auch nicht, was das Ganze hier eigentlich soll, denn die Aufgabenstellung ist eigentlich nichts, was man so täglich und sinnvoll mit einem simplen Script umsetzen kann, schon dreimal nicht, wenn die Anforderungen sich ständig ändern. Da wäre ein kleines Tool mit Eingabemaske sinnvoller (was theoretisch auch per Batch-Script geht).
 
  • Gefällt mir
Reaktionen: henpara und tollertyp
Ganz im Ernst: Mittlerweile wäre ich auch an dem Punkt angelangt, zu einem Rename-Tool zu raten, z.B. dem Bulk Rename Utility - das habe ich auch beruflich in der Vergangenheit schon genutzt, das Teil ist echt abgefahren.
 
tollertyp schrieb:
Also wenn immer wieder Dateien hinzukommen, ist ein Script natürlich sinnvoll.

Aber wie kann man sich das dann vorstellen?
Wenn also heute "config-123" drin ist und zu "config-achja" umbenannt wird, und dann kommt "config-246" dazu, zu was soll das umbenannt werden? Und ich nehme an "config-achja" soll nach wie vor "config-achja" heißen? Das sind alles Faktoren, die du anfangs hättest nennen sollen, weil der Wildcard ist es egal, ob da -246 oder -achja steht.
Nur nochmal zur Vollständigkeit, die Zieldatei soll immer ersetzt und überschrieben werden, der Name soll weiterhin "config-achja" sein (config-achja wird anderswo mit dem Namen importiert und weiterverarbeitet).

Natürlich, dass habe ich vergessen, werden die alten -123 Dateien gelöscht. Es existiert immer nur eine neue Datei config-123.

Ich hab es jetzt so "gelöst":

@echo off
setlocal enableDelayedExpansion
for %%F in ("config*") do (
set "name=%%F"
ren "!name!" "config-achja"
)
 
Zuletzt bearbeitet:
mir ist hier nicht klar, wozu es da die For-Schleife usw braucht, aber du wirst es schon wissen...

Also was hier gegen
Code:
ren "config*" "config-achja"
gesprochen hätte.

Am einfachsten wäre es gewesen, die Problembeschreibung auch einfach so zu machen, dass man weiß, was du willst. Klassischer Fall halt von X-Y-Problem.

Die Fragestellung:
Hallo, ich habe eine Hand voll Dateien. ich erhalte immer wieder neue Versionen mit etwas unterschiedlichen Dateinamen, möchte aber, dass sie einen festen Namen haben, also immer unter dem gleichen Namen erreichbar sind.

Das Namensschema der Dateien mit Version sieht so und so aus, das Schema des Zieldateinamens ist so und so...


Aber stattdessen wird bereits eine Lösung für die Aufgabe überlegt, man weiß aber nicht, wie man die Lösung umsetzen kann, also fragt man nach Hilfe für die Lösung anstelle für die Aufgabe.
 
  • Gefällt mir
Reaktionen: xexex
ich möchte nur anmerken das man powershell in der windows firewall immer die berechtigung enztiehen muss nach aussen zu kommunizieren.
 
Zurück
Oben