flaschback
Goto Top

Dateinamen-String vor und nach einem bestimmten Zeichen Tauschen

Hallo, ich würde mich über jede Hilfe freuen, da es eine sehr nervenaufreibende Arbeit wäre alles von Hand zu machen, darum wende ich mich an diese Community ...

Hallo,

Ich möchte gern einen Dateinamen auslesen, und Wörter (String) vor einem Zeichen z.B. "-" oder "_" und einen String nach diesem Zeichen tauschen.
Hier ein Beispiel:

Hallo Welt - Hersteller Gott.txt

nach der Konvertierung soll die Datei inhaltlich unverändert bleiben und heissen:

Hersteller Gott - Hallo Welt.txt

(die Zeichenlänge vor und nach dem "-" ist variabel und Alphanummerisch)

das müsste ich weiß nicht wie oft ... also soviele male wie Dateien sich in dem Ordner befinden durchgeführt werden ... auch ordnerunabhängig.
Es spielt auch keine Rolle welches Suffix hinter dem . steht (.txt oder .php ... etc.)

Vieleicht kennt jemand ein Tool oder eine Batch die mir hierbei helfen könnte ?
Ich währe sehr dankbar !!!

PS: ich hab schon einige Tools ausprobiert und alle bieten ein verschieben an jedoch nicht mit Bedingung vor oder nach einem Zeichen als austausch des String :o(

Content-Key: 121440

Url: https://administrator.de/contentid/121440

Printed on: April 26, 2024 at 21:04 o'clock

Member: rubberman
rubberman Jul 27, 2009 at 19:42:30 (UTC)
Goto Top
Das sollte relativeinfach in einer FOR -Schleife zu verwirklichen sein, in der man zB. "-" als Delimiter setzt. Interessant in diesem Fall wäre aber noch eins: So ie du es gepostet hast, befindet sich vor und hinter dem Bindestrich ein Leerzeichen. Ist das in der Realität auch so und soll es in den umgewandelten Namen wieder so sein?
Member: bastla
bastla Jul 27, 2009 at 19:49:15 (UTC)
Goto Top
Hallo Flaschback und willkommen im Forum!

Lt Deinem Beispiel wären auch noch Leerzeichen vor und nach dem Trennzeichen ...

Falls dem nicht so wäre, müsste etwa folgender Batch genügen:
@echo off & setlocal
set "Ordner=D:\Test"  
set "Typ=txt"  

for %%i in ("%Ordner%\*.%Typ%") do for /f "tokens=1,2 delims=-" %%a in ("%%~ni") do echo ren "%%i" "%%b-%%a%%~xi"  
Das "echo" vor dem "ren" sorgt dafür, dass (zum Testen) das Umbenennen nur angezeigt, aber noch nicht durchgeführt wird.

Grüße
bastla

[Edit] Ich war auch schon mal schneller ... face-sad [/Edit]
Member: Flaschback
Flaschback Jul 27, 2009 at 19:57:44 (UTC)
Goto Top
Danke für die "Erste-Hilfe" ;o) ... ja es befindet sich ein Leerzeichen vor und nach dem "-", macht das die Sache komplizierter ?

Ich habe auch mal eine Datei ohne Leerzeichen gespeichert und getestet ... er zeigt mir das Ergebnis korrekt an mit dem Befehl Pause konnte ich es dann sehen ;o)

Welcher Befehlssatz fehlt denn damit ich die Datei danach auch so wieder schreibe ?
Member: bastla
bastla Jul 27, 2009 at 20:07:34 (UTC)
Goto Top
Hallo Flaschback!
macht das die Sache komplizierter ?
Nicht wirklich face-wink
@echo off & setlocal
set "Ordner=D:\Test"  
set "Typ=txt"  

for %%i in ("%Ordner%\*.%Typ%") do for /f "tokens=1,2 delims=-" %%a in ("%%~ni") do set "Teil1=%%b" & set "Teil2=%%a" & call :ProcessFile "%%~fi"  
pause
goto :eof

:ProcessFile
:Loop1
if "%Teil1:~,1%"==" " (set "Teil1=%Teil1:~1%" & goto :Loop1)  

:Loop2
if "%Teil2:~-1,1%"==" " (set "Teil2=%Teil2:~,-1%" & goto :Loop2)  

echo ren %1 "%Teil1% - %Teil2%%~x1"  
goto :eof
In dieser Version wird am "-" geteilt, und alle unmittelbar davor bzw danach befindlichen Leerzeichen (auch mehrere) werden eliminiert. Am Ende wird wieder mit je einem Leerzeichen vor und nach dem "-" zusammengesetzt.

Grüße
bastla

[Edit]
Habe nun die test.bat mal ausprobiert, jedoch wurde nichts getausch :o( ... auch wurde mein cmd fenster gleich wieder geschlossen ... hmm, mache ich hier auch etwas falsch ?
Beim Testen von Batches solltest Du das CMD-Fenster bereits vorher öffnen und von der Kommandozeile aus starten oder zumindest den Befehl "pause" an das Ende des Batches stellen - mache ich in der neuen Version ...

Geändert wird auch in dieser Version nichts an den Dateinamen, solange vor dem "ren" das "echo" steht - wenn Du es entfernst, wird tatsächlich umbenannt (und dann ist auch "pause" nicht mehr nötig)
[/Edit]

[Edit2] Noch ein paar unnötige "echo"-Zeilen entfernt [/Edit2]
Member: pieh-ejdsch
pieh-ejdsch Jul 27, 2009 at 20:11:10 (UTC)
Goto Top
Hallo Flaschback,

hier für Batch ungetestet im Ordner
set pfad=D:\test\
for /f "tokens=1-3 delims=-_." %%b in ('dir "%pfad%" /a-d /b ') do if exist "%pfad%%%b-%%c.%%d" (ren "%pfad%%%b-%%c.%%d" "%%c-%%b.%%d") else if exist "%pfad%%%b_%%c.%%d" ren "%pfad%%%b_%%c.%%d" "%%c_%%b.%%d"  

viel zu spät und vllt gehts gar net.....naja
Member: Flaschback
Flaschback Jul 27, 2009 at 20:18:50 (UTC)
Goto Top
Danke deine Lösung funktioniert im Ansatz (also anzeige in der cmd) ... ich verzichte auf die Leerzeichen, diese kann ich ja mit einem Tool entfernen, aber er speichert die Datei nicht wieder im Testordner ...
Member: bastla
bastla Jul 27, 2009 at 20:20:48 (UTC)
Goto Top
Hallo Flaschback!
aber er speichert die Datei nicht wieder im Testordner ...
... nachdem Du das "echo" in Zeile 16 (habe oben noch einige Zeilen herausgenommen) entfernt hast?

Ansonsten noch ein Hinweis: Das Umbenennen erfolgt (derzeit) nur, wenn es noch keine gleichnamige Datei gibt - was sollte denn im Fall des Falles dann passieren?

Grüße
bastla
Member: Flaschback
Flaschback Jul 27, 2009 at 20:27:40 (UTC)
Goto Top
Jo, leider speichert er diese nicht wie gewünscht, bzw. bennent sie nicht um

auch wird das Fenster sofort geschlossen obwoh hier nun pause am ende steht ...
Member: Flaschback
Flaschback Jul 27, 2009 at 20:28:25 (UTC)
Goto Top
hier erscheint immer das "Datei nicht gefunden" wurde...
Member: rubberman
rubberman Jul 27, 2009 at 20:31:43 (UTC)
Goto Top
Vermute, die umbenannte Datei wird gleich wieder gefunden, und erneut umbenannt. Vielleicht wäre es besser die DIR Ausgabe zu verarbeiten ?!
Member: bastla
bastla Jul 27, 2009 at 20:37:35 (UTC)
Goto Top
@rubberman
Vermute, die umbenannte Datei wird gleich wieder gefunden, und erneut umbenannt.
Ist zwar bei meinen Tests nicht passiert, möchte ich aber auch nicht ausschließen ...

Die Zeile 5 sollte dann so aussehen:
for /f "delims=" %%i in ('dir /b /a-d "%Ordner%\*.%Typ%"') do for /f "tokens=1,2 delims=-" %%a in ("%%~ni") do set "Teil1=%%b" & set "Teil2=%%a" & call :ProcessFile "%Ordner%\%%i"

Grüße
bastla
Member: Flaschback
Flaschback Jul 27, 2009 at 20:38:06 (UTC)
Goto Top
Das ist eine sehr gute Frage herr Professor, darf ich mal googlen ?
hmm, in deiner ersten Version hat er ja die beiden Test Dateien erfolgreich angezeigt wie sie aussehen sollten ... nun hab ich die erste "Version nochmals getestet, merkwürdig ist nun aber das er trotz des pause Befehl das Fenster schliesst ...
Member: Flaschback
Flaschback Jul 27, 2009 at 20:43:49 (UTC)
Goto Top
Nein ..

Ihr seid super !!!

Ich habe nur den Fehler begangen die test.bat in den Testordner abzulegen und dort auszuführen ...

als ich die auf dem Deskop nochmals ausgeführt habe wurde ein Wunsch wahr ...

Mensch ich danke euch !!!

Vielen vielen Dank !!!
Member: bastla
bastla Jul 27, 2009 at 20:46:12 (UTC)
Goto Top
Hallo Flaschback!

Steht "pause" auch in einer eigenen Zeile?
Wie auch immer, so sollte es jedenfalls klappen ("pause" und "Test-echo" gleich weggelassen und noch ein klein wenig verschönert - siehe Festlegung des Trennzeichens in Zeile 4):
@echo off & setlocal
set "Ordner=D:\Test"  
set "Typ=txt"  
set "Del=-"  

for /f "delims=" %%i in ('dir /b /a-d "%Ordner%\*.%Typ%"') do for /f "tokens=1,2 delims=%Del%" %%a in ("%%~ni") do set "Teil1=%%b" & set "Teil2=%%a" & call :ProcessFile "%Ordner%\%%i"  
goto :eof

:ProcessFile
:Loop1
if "%Teil1:~,1%"==" " (set "Teil1=%Teil1:~1%" & goto :Loop1)  

:Loop2
if "%Teil2:~-1,1%"==" " (set "Teil2=%Teil2:~,-1%" & goto :Loop2)  

ren %1 "%Teil1% %Del% %Teil2%%~x1"  
goto :eof
Grüße
bastla
Member: rubberman
rubberman Jul 27, 2009 at 20:58:21 (UTC)
Goto Top
@bastla, sorry für meine Schnelligkeit. Hab mich dann etwas zurückgehalten, um dir den Spaß nicht zu vermießen face-wink

Hab das gerade noch mal getestet:
Liegt der Batch im Testverzeichnis, funktioniert nur die DIR-Version, da sonst die Datei gleich wieder erkannt wird.
Anderenfalls gehts auch ohne DIR. (Bill weiß warum face-smile )
Member: pieh-ejdsch
pieh-ejdsch Jul 27, 2009 at 21:02:12 (UTC)
Goto Top
ist der letzte Backslash bei pfad?
Member: bastla
bastla Jul 27, 2009 at 21:15:57 (UTC)
Goto Top
@rubberman
Hab mich dann etwas zurückgehalten, um dir den Spaß nicht zu vermießen face-wink
Danke, ganz lieb face-wink - war aber wirklich nicht nötig ...

Liegt der Batch im Testverzeichnis, funktioniert nur die DIR-Version, da sonst die Datei gleich wieder erkannt wird.
Anderenfalls gehts auch ohne DIR. (Bill weiß warum face-wink )
Bist Du Dir hinsichtlich des (ganz) Letzteren sicher? face-wink

Es gäbe übrigens noch eine dritte Möglichkeit: Ein "pushd" oder "cd /d" in das Testverzeichnis hinein - was dann wohl passiert?

Grüße
bastla
Member: Flaschback
Flaschback Jul 27, 2009 at 21:16:34 (UTC)
Goto Top
Funktioniert auch ... ohne Leerzeichen zwar aber hatte hier den selben Fehler begangen ... auf den Desktop funtionierte deine Batch einwandfrei !!!
Member: Flaschback
Flaschback Jul 27, 2009 at 21:32:20 (UTC)
Goto Top
Hier kommt es bei der Batch übrigens zu Fehlern, bei der Anzahl von 600 Dateien muss ich nun manuell auswerten wo er den Dateinamen angepasst hat und wo nicht ... egal, viele Stunden Arbeit erspart und ne menge Nerven ! Warum er die manchmal nicht geändert hat ist mir schleierhaft ... in dem Testordner hatte ich eine Anzahl von > 20 getestet (die erste Datei wird übrigens in allen Fällen nicht umbenannt)
Member: rubberman
rubberman Jul 27, 2009 at 21:38:32 (UTC)
Goto Top
@bastla
Wenn man in das Verzeichnis wechselt, verhält sich der Batch natürlich so, als würde er dort liegen. Und das ist auch schon das einzig logische an dem, was Bill (vermutlich doch nicht) weiß face-wink

<edit> und Flaschback hat schon das nächste Mysterium </edit>
Member: pieh-ejdsch
pieh-ejdsch Jul 27, 2009 at 22:01:00 (UTC)
Goto Top
wie sieht den der Dateiname der ersten Datei aus?
zum Auswerten - logge die Umbenannten Dateien doch einfach.
bei mir im Testordner benennt die Batch nur die Dateien um, welche "Teilstring-Teilstring2.ext"
oder "Teilstring_Teilstring2.ext" nach Teilstring2-Teilstring.ext bzw Teilstring2_Teilstring.ext um.
alle anders aufgebauten Namen von Dateien werden nicht umbenannt da nicht so aufgebaut im Dateiname.
und es ist auch völlig egal wo die Batch bei mir ist solange der komplette pfad angegeben ist.
wenn die Pfadangabe im REN Befehl fehlt und die Datei nicht im (Batch)-REN verzeichnis ist wird auch nichts umbenannt.
Member: Flaschback
Flaschback Jul 27, 2009 at 22:34:57 (UTC)
Goto Top
Öhm ... Leute ... ich bin äusserst zufrieden, Ihr solltet es auch sein.

Du hast mich schon glücklich gemacht, die Batch-Datei war unter den Test-Dateien. Hab übrigens bemertkt woran es ebenfalls liegt ... die Datei-Endung ist schuld ... manche haben .PHP dann wieder .php ... jaja Augen auf ;o) ... Ich werde euer Forum weiterempfehlen, so schnelle Hilfe hätte ich nun gar nicht erwartet ! Ihr habt mir bestimmt 1-2 Tage Arbeit dadurch abgenommen, wenn ich überlege ich hätte alles manuell ändern müssen (Mir war schon ganz anders).

Nachmals Danke !!!
Member: bastla
bastla Jul 28, 2009 at 08:18:52 (UTC)
Goto Top
Hallo Flaschback!

Freut mich, dass es nun klappt. face-smile

Allerdings kann ich mir nicht vorstellen, dass die Groß-/Kleinschreibung der Datei-Endung der Fehler war, da die Endung (in Form der Variablen %Typ%) nur im "dir"-Befehl verwendet wird, und dem ist's egal, ob "PHP" oder "php" ...

Grüße
bastla