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-Key: 22668

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

Printed on: April 19, 2024 at 04:04 o'clock

Member: Biber
Biber Jan 03, 2006 at 15:51:36 (UTC)
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
Member: D.T.Soko
D.T.Soko Jan 04, 2006 at 08:21:40 (UTC)
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
Member: Biber
Biber Jan 04, 2006 at 13:32:36 (UTC)
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!
Member: D.T.Soko
D.T.Soko Jan 04, 2006 at 16:08:44 (UTC)
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
Member: Biber
Biber Jan 04, 2006 at 17:09:46 (UTC)
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
Mitglied: 20638
20638 Jan 04, 2006 at 17:26:55 (UTC)
Goto Top
Hast grad meine Verbeugug verdient.

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

MfG
JT
Member: Biber
Biber Jan 04, 2006 at 17:39:00 (UTC)
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
Mitglied: 20638
20638 Jan 04, 2006 at 17:48:27 (UTC)
Goto Top
@Biber
wieder einmal thx.
Werde wieder Wissen saugen.....

MfG
JT
Member: Biber
Biber Jan 04, 2006 at 18:19:51 (UTC)
Goto Top
-OT gelöscht-
Mitglied: 20638
20638 Jan 04, 2006 at 18:21:43 (UTC)
Goto Top
-OT gelöscht- Biber
Member: D.T.Soko
D.T.Soko Feb 23, 2006 at 13:52:34 (UTC)
Goto Top
Statusänderung
mfg
Doc.T.Soko