Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dateiname umbenennen - kürzen

Frage Entwicklung Batch & Shell

Mitglied: D.T.Soko

D.T.Soko (Level 1) - Jetzt verbinden

03.01.2006, aktualisiert 23.02.2006, 11518 Aufrufe, 11 Kommentare

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:
<font class="code">for /F %a in ('dir c:\g??????105.gut ') do set term0=%a
</font>
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
Mitglied: Biber
03.01.2006 um 16:51 Uhr
Moin D.T.Soko,

das bekommen wir heute noch hin
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
Bitte warten ..
Mitglied: D.T.Soko
04.01.2006 um 09:21 Uhr
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.
Genau das selbe passiert wenn ich das "G" weglass.

Gruß D.T.Soko
Bitte warten ..
Mitglied: Biber
04.01.2006 um 14:32 Uhr
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!
Bitte warten ..
Mitglied: D.T.Soko
04.01.2006 um 17:08 Uhr
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.

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
mfg
D.T.Soko
Bitte warten ..
Mitglied: Biber
04.01.2006 um 18:09 Uhr
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
Bitte warten ..
Mitglied: JT
04.01.2006 um 18:26 Uhr
Hast grad meine Verbeugug verdient.

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

MfG
JT
Bitte warten ..
Mitglied: Biber
04.01.2006 um 18:39 Uhr
@JT
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
Bitte warten ..
Mitglied: JT
04.01.2006 um 18:48 Uhr
@Biber
wieder einmal thx.
Werde wieder Wissen saugen.....

MfG
JT
Bitte warten ..
Mitglied: Biber
04.01.2006 um 19:19 Uhr
-OT gelöscht-
Bitte warten ..
Mitglied: JT
04.01.2006 um 19:21 Uhr
-OT gelöscht- Biber
Bitte warten ..
Mitglied: D.T.Soko
23.02.2006 um 14:52 Uhr
Statusänderung
mfg
Doc.T.Soko
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...