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:
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
[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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 22668
Url: https://administrator.de/forum/dateiname-umbenennen-kuerzen-22668.html
Ausgedruckt am: 23.04.2025 um 03:04 Uhr
11 Kommentare
Neuester Kommentar
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!
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!
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
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

Hast grad meine Verbeugug verdient.
Gibt es schon ein Tut über Batch Programmierung.
Interresiere mich voll für das Thema.
MfG
JT
Gibt es schon ein Tut über Batch Programmierung.
Interresiere mich voll für das Thema.
MfG
JT
@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.
@D.T.Soko
Ich gehe mal von Deinem Einverständnis aus und setze den Beitrag auf "Closed".
Grüße Biber
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.
@D.T.Soko
Ich gehe mal von Deinem Einverständnis aus und setze den Beitrag auf "Closed".
Grüße Biber


-OT gelöscht- Biber