d.t.soko
Goto Top

Dateiname umbenennen - kürzen

Dateinamen per Batch umbenennen bzw. an bestimmten Stellen kürzen.
[Edit] Closed - aus meiner Sicht beantwortet. Biber [/Edit]

Hallo zusammen,

ich habe ein kleines Problem mit ein paar Dateien die täglich bei mir auf einem Server erstellt werden.

Ja man glaubt es kaum die Dateien Sind zu lang um Sie automatisiert weiter zu verarbeiten.

Lösungsansatz:
Ich habe mir gedacht die verschiedenen Datei als Variable zu speichern - zu kürzen und mit "ren" um zu benennen.

Vorher:
G060102105.gut, "G" halt ein G | "060102" Datum | "105" TermialID | .gut Art der Datei
und irgendwie muss daraus jetzt eine 8.3 konforme Datei werden:
Nachher:
0601020.gut. "060102" Datum | "0" TermialID | .gut Art der Datei

Warum So kompliziert? Weil in dem Verzeichnis übers Wochenende ca 10 Dateien von verschiedenen Terminals mit verschiedenen Arten auflaufen die danach weiterverarbeitet werden.

Die Dateien bekomme ich über:
for /F %a in ('dir c:\g??????105.gut ') do set term0=%a  
als Variable.
Jetzt fehlt mir nur noch das "Kürzen".

Bitte um Hilfe. Wenn jemand einen anderen Lösungsansatz hatt; nur Raus damit.

mfg
D.T.Soko

Content-ID: 22668

Url: https://administrator.de/forum/dateiname-umbenennen-kuerzen-22668.html

Ausgedruckt am: 23.04.2025 um 03:04 Uhr

Biber
Biber 03.01.2006 um 16:51:36 Uhr
Goto Top
Moin D.T.Soko,

das bekommen wir heute noch hin face-wink
Eine Rückfrage vorher: Eine "Übersetzungstabelle" für die bisher 3stelligen Terminal-IDs ("105") in irgendwas 1stelliges hast Du bereits?
Oder woher kommt die Übersetzungsregel?
Kannst Du diese Übersetzungstabelle mal (als Skizze) posten bitte?

Gruß Biber
D.T.Soko
D.T.Soko 04.01.2006 um 09:21:40 Uhr
Goto Top
Die 105 ist nur ein Teil der TerminalID im eigentlichen werden die ID nur an einer Stelle unterschieden und zwar de "0" der rest ist gleich.

Habe zwar schon versucht dem Programm beizubringen das er mir nur die eine Stelle ausgibt aber das gibt lustige Doppelbuchungen. face-wink
Genau das selbe passiert wenn ich das "G" weglass.

Gruß D.T.Soko
Biber
Biber 04.01.2006 um 14:32:36 Uhr
Goto Top
Moin D.T.Soko,

danke für die Rückmeldung, aber jetzt kann ich mir das Szenario besser vorstellen. Hatte es vorher nicht ganz verstanden.

Also, von den vielen denkbaren Möglichkeiten gibt es vier, die ich un Erwägung ziehen würde als Lösungsansatz.

a) plumper, aber übersichtlicher ("lesbarer") Batch mit je einem Rename-Befehl je Zeile
b) wie a), aber Renamerei in einer For..IN..DO..Anweisung
c) Batch mit FOR...IN..DO.. Anweisung, "Übersetzung" des 3stelligen Terminals mit Substring-Funktion
d) Batch mit FOR...IN..DO.. Anweisung, "Übersetzung" des 3stelligen Terminals mit Hilfsdatei

Mein Ausgangsszenario wäre im Beispiel so:
Es existieren die Dateien

G053112175.gut
G060102105.gut
G060103105.gut
G060103115.gut
G060102125.gut

...G*105.gut sind die Dateien von Terminal 0,
...G*175.gut sind die Dateien von Terminal 7,
...G*115.gut sind die Dateien von Terminal 1,
...G*125.gut sind die Dateien von Terminal 2,


Ein Batch der Kategorie a) sähe so aus:
a)
::---snipp RenameGutsA.bat
@echo off & setlocal
Set "GutDir=C:\"
PushD %GutDir%
if exist G??????105.gut ren G??????105.gut G??????0.gut
if exist G??????115.gut ren G??????115.gut G??????1.gut
if exist G??????125.gut ren G??????125.gut G??????2.gut
if exist G??????175.gut ren G??????175.gut G??????7.gut
::andere Termainals entsprechend
Popd
::---snapp RenameGutsA.bat

b1) Variante mit FOR..In..DO; einzeln aufgeführte Terminals
::---snipp RenameGutsB1.bat
@echo off & setlocal
Set "GutDir=C:\"
PushD %GutDir%
FOR %%i in (0,1,2,7) do if exist G??????1%%i5.gut ren G??????1%%i5.gut G??????%%i.gut
Popd
::---snapp RenameGutsB1.bat

b2) Variante mit FOR /L ..In..DO; in Reihe aufgeführte Terminals von 0...9
::---snipp RenameGutsB2.bat
@echo off & setlocal
Set "GutDir=C:\"
PushD %GutDir%
FOR /L %%i in (0,1,9) do if exist G??????1%%i5.gut ren G??????1%%i5.gut G??????%%i.gut
Popd
::---snapp RenameGutsB2.bat

Die Varianten b1) und b2) wären natürlich jeweils nur ein Oneliner vom CMD-Prompt aus:
$cmd$ FOR %i in (0,1,2,7) do if exist G??????1%i5.gut ren G??????1%i5.gut G??????%i.gut
-bzw.-
$cmd$ FOR /L %i in (0,1,9) do if exist G??????1%i5.gut ren G??????1%i5.gut G??????%i.gut

.. aber falls Du die Umbenennerei als Dienst regelmäßig ausführen lässt, wäre ja ein Bätchelchen angebracht.

c) ..mit Substring-Funktion
::---snipp RenameGutsC.bat
@echo off & setlocal
Set "GutDir=C:\"
PushD %GutDir%
For /F %%i in ('dir /b G*.gut') do call :RenameIt %%~ni
goto :eof
:RenameIt Parameter1 ist der Name OHNE Endung
Set "OldName=%1"
Set "NewName=%Oldname:~0,-3%%OldName:~-2,1%"
ren %Oldname%.gut %NewName%.gut
goto :eof
::---snapp RenameGutsC.bat

Variante C ist ungleich schwerer lesbarer (und wartbarer, wenn Du mal Urlaub machst), da diese Substring-Syntax doch für den Laien etwas strange anmutet.
Inhaltlich steht da:
NewName ist Teilstring(Oldname,VonBeginn,BisLängeMinus3) plus (Teilstring, Oldname, zweitletztesZeichen, 1ZeichenLang)

d) Diese Variante wäre sinnvoll bei expliziter statt impliziter Renaming-Regel, wenn Du also eine "Übersetzungstabelle" brauchst, z.B.:

::---Bsp XLate.lst
105=A
115=B
...
195=I
::---Bsp XLate.lst

Diese Mimik habe ich gestern in dem Beitrag von PeMue vorgekaspert hier im Bereich "Batch & Shell".
Bei Bedarf da einen Blick reinwerfen.

HTH Biber
P.S. Grundsätzlich sind alle Bätche mit weniger als 30 Zeilen von mir ungetestet, also ggf. Tippfehler berichtigen!
D.T.Soko
D.T.Soko 04.01.2006 um 17:08:44 Uhr
Goto Top
Hallo nochmal Biber,

THX für die Hilfe.
Habe mich für Variante C entschieden da ich für jede Art dann nur einen script-block habe.

Endgültiger Script:

For /F %%i in ('dir /b L*.las') do call RenameItlas %%~ni
For /F %%i in ('dir /b g*.gut') do call RenameItgut %%~ni
:RenameItlas
set "OldName=%1"
Set "NewName=%OldName:~1,-3%%OldName:~-2,1%"
ren %OldName%.las %NewName%.las
goto :eof


(jetzt kommt das ganze nur noch mit den anderen Dateiendung.)

Fertig und funktioniert. face-smile

Hab nur bei Set "NewName=%OldName:~1 das "~1" geändert um das "G" verschwinden zu lassen.

Danke dir recht herzlich für deine schnelle Hilfe.
Und schöne grüße aus dem verschneiten Allgäu face-smile
mfg
D.T.Soko
Biber
Biber 04.01.2006 um 18:09:46 Uhr
Goto Top
Fein, D.T.Soko,

dann hätte ich noch folgenden (kosmetischen) Verbesserungsvorschlag:
(mit Übergabe der Datei-Extension als 2. Parameter)
For /F %%i in ('dir /b L*.las G*.gut') do call RenameItAll %%~ni %%~xi

:RenameItAll
set "OldName=%1"
Set "NewName=%OldName:~1,-3%%OldName:~-2,1%"
ren %OldName%%2 %NewName%%2
goto :eof

Grüße zurück aus dem schmuddelwettrigen Bremen
Biber
20638
20638 04.01.2006 um 18:26:55 Uhr
Goto Top
Hast grad meine Verbeugug verdient.

Gibt es schon ein Tut über Batch Programmierung.
Interresiere mich voll für das Thema.

MfG
JT
Biber
Biber 04.01.2006 um 18:39:00 Uhr
Goto Top
@20638
Klar, im Bereich "Batch und Shell" gibt es genauso Tutorials wie in den anderen Bereichen auch.
Einige der neueren sind allerdings etwas langatmig, munkelt man/frau. face-wink

@D.T.Soko
Ich gehe mal von Deinem Einverständnis aus und setze den Beitrag auf "Closed".

Grüße Biber
20638
20638 04.01.2006 um 18:48:27 Uhr
Goto Top
@Biber
wieder einmal thx.
Werde wieder Wissen saugen.....

MfG
JT
Biber
Biber 04.01.2006 um 19:19:51 Uhr
Goto Top
-OT gelöscht-
20638
20638 04.01.2006 um 19:21:43 Uhr
Goto Top
-OT gelöscht- Biber
D.T.Soko
D.T.Soko 23.02.2006 um 14:52:34 Uhr
Goto Top
Statusänderung
mfg
Doc.T.Soko